麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

gSOAP中內存的使用

2019-11-17 05:14:38
字體:
來源:轉載
供稿:網友

  一.概述 2
二.例子程序簡要說明 2
三.server端 2
四.client端 3
五.Valgrind的使用 3
六.參考文檔 4
七.備注 4

一.概述
在gSOAP的server和client端連接中,內存的處理有些是gSOAP自己處理的,有些需要我們來考慮。本文檔主要就其中目前可能碰到的內存問題,做一個簡要的介紹及說明。另外,簡要介紹了一下內存檢測工具valgirnd的使用及注重事項。
二.例子程序簡要說明
例子程序實現的是client端傳入一個參數num,server端返回一個字符串,是一段不知道多長的buffer,這樣需要在server端動態分配空間。這段內存的治理是本文主要討論的問題。例子的實現可能有些冗余,但是為了說明一些問題,所以做了一些多余的實現。
得到的server端名稱為getmsgserver,client端名稱為getmsgtest,server啟動在8888端口。
三.server端
省略server端的main函數,其功能實現函數如下:
int ns__getmsg(strUCt soap *getmsg_soap, int num, char **msg)
{
//下面這個空間為我們自己分配的空間,所以后來需要用free顯式釋放,在xmail系統中可能是從mss獲取到的一段buffer,例子中的1024是隨意填寫的
char *a=(char*)malloc(1024);
memset(a, 0, 1024);
s
//下面這個空間由soap分配,在server端的main函數中由soap_end釋放該空間,由soap自己來控制,還可以直接使用*msg = soap_strdup(getmsg_soap, a)實現下面3句話,但是這個函數只適用于char*的拷貝,假如是struct的copy還是使用下面的實現方式
*msg = (char*)soap_malloc(getmsg_soap, 1024);
memset(*msg, 0, 1024);

//將我們的buffer(可能是從mss獲取的)拷貝到soap治理的空間中
memcpy(*msg, a, strlen(a));

//釋放由我們自己分配的空間
free(a);
return 0;
}
四.client端
client端做了簡單的封裝,封裝后的函數如下:
int getmsg( const char* server, int num, char **msg )
{
struct soap getmsg_soap;
int result = 0;
char *getmsg = NULL;
soap_init(&getmsg_soap);
soap_set_namespaces(&getmsg_soap, getmsg_namespaces);

//下面是從server端獲取數據,注重,得到的buffer在調用soap_end后空間就會被釋放,所以需要定義變量getmsg,不能直接將參數msg作為此處的最后一個參數。當然,假如是在使用完msg后才調用soap_end,或者不需要將msg傳出,此處就可以直接將msg作為最后一個參數。
soap_call_ns__getmsg( &getmsg_soap, server, "", num, &getmsg );
if(getmsg_soap.error)
{
printf("soap error:%d,%s,%s/n", getmsg_soap.error, *soap_faultcode(&getmsg_soap), *soap_faultstring(&getmsg_soap) );
result = getmsg_soap.error;
}

//將從server端得到的buffer轉儲到msg中
if(getmsg)
{
*msg = strdup(getmsg);
}
soap_end(&getmsg_soap);
soap_done(&getmsg_soap);
return result;
}

這樣,調用完函數int getmsg( const char* server, int num, char **msg )后,需要釋放最后一個參數的空間,這個與一般的c程序相同。
五.Valgrind的使用
直接在終端鍵入valgrind,然后回車,可以看見一些幫助,以下是幾個常用的選擇項,選項可以聯合使用:
1. 對server端進行非法指針操作檢測:
shell>valgrind ./getmsgserver 8888
在另外一個終端執行
shell>./getmsgtest 89
2. 對server端進行內存泄漏檢測,在main函數的soap_end后面添加一個exit(0),以便觀察server接收一次請求后退出的情況,這樣可以真實查看內存是否完全釋放:
shell>valgrind --leak-check=yes ./getmsgserver 8888
在另外一個終端執行
shell>./getmsgtest 89
3. 對server端進行內存檢測,是否有些內存沒有完全回收:
shell>valgrind –show-reachable=yes./getmsgserver 8888
在另外一個終端執行
shell>./getmsgtest 89
4. 對client端進行非法指針操作檢測:

shell>./getmsgserver 8888
在另外一個終端執行
shell> valgrind ./getmsgtest 89
5. 對client端進行內存泄漏檢測:
shell>./getmsgserver 8888
在另外一個終端執行
shell>valgrind --leak-check=yes ./getmsgtest 89
6. 對client端進行內存檢測,是否有些內存沒有完全回收:
shell>./getmsgserver 8888
在另外一個終端執行
shell> valgrind –show-reachable=yes ./getmsgtest 89
六.參考文檔
1.gSOAP的內存治理
http://www.cs.fsu.edu/~engelen/soapdoc2.Html#tth_sEc9.13

2.Valgrind的主頁
http://valgrind.kde.org/
七.備注
在192.168.18.233的/home/weiqiong/soap/getmsg目錄下有本文講到的例子。用法更復雜的例子參見cvs中的xmail/pmd/ws/addrbook目錄下的實現,是從mss獲取地址本的實現。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美亚洲综合在线 | 国产91在线亚洲 | 免费在线观看亚洲 | 欧美一级α | 九九热视频这里只有精品 | 久久久久91视频 | 色成人在线 | 免费观看视频91 | 黄色影院在线看 | 日本s级毛片免费观看 | 久久久久久久久久久久久久国产 | 亚洲第五色综合网 | 偿还的影视高清在线观看 | 日韩每日更新 | 成人激情视频网 | 免费看一级视频 | 色综合欧美 | 成人精品一区二区三区中文字幕 | 一本到免费视频 | 欧美一级电影网 | 午夜视频在线观看91 | 国产自在线 | 国产正在播放 | 黄污在线观看 | 欧美黄色一级片在线观看 | 欧美 videos粗暴 | 毛片在线免费播放 | 成人在线观看一区二区三区 | 亚洲特黄 | 日韩黄色片在线观看 | 久久久av影视 | 国产一区二区在线观看视频 | 国产精品99精品 | 日本不卡一区二区三区在线 | a视频在线免费观看 | 久久精品一区二区三区四区五区 | 国产精品亚洲精品日韩已方 | 91久久国产露脸精品国产 | 日韩视频一区 | 亚欧在线免费观看 | 中文字幕在线免费观看电影 |