gSoap下Server端接口函數的數據傳出

轉自:http://www.cnblogs.com/torome/archive/2011/03/10/1980043.htmlhtml

一.概述2
二.例子程序簡要說明2
三.server端2
四.client端3
五.Valgrind的使用3
六.參考文檔4
七.備註4
一.概述
在gSOAP的server和client端鏈接中,內存的處理有些是gSOAP本身處理的,有些須要咱們來考慮。
) Y! V0 L% W! {! z8 s3 s正在裝載數據……本文檔主要就其中目前可能遇到的內存問題,作一個簡要的介紹及說明。另外,簡要介紹了一下內存檢測工具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);
sprintf(a, "num=%d\n",num);
//下面這個空間由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獲取地址本的實現。shell

相關文章
相關標籤/搜索