一些述說
recv函數用於socket通信中接收消息,接口定義如下:
int recv(SOCKET s, char *buf, int len, int flags) 參數一:指定接收端套接字描述符; 參數二:指向一個緩沖區,該緩沖區用來存放recv函數接收到的數據; 參數三:指明buf的長度; 參數四:一般置為0; 返回值:失敗時,返回值小於0;超時或對端主動關閉,返回值等於0;成功時,返回值是返回接收數據的長度。
send函數用於socket通信中發送消息,接口定義如下:
int send(SOCKET s, const char FAR *buf, int len, int flags ); 參數一:指定發送端套接字描述符; 參數二:指明一個存放應用程序要發送數據的緩沖區; 參數三:指明實際要發送的數據的字節數; 參數四:一般置0; 返回值:失敗時,返回值小於0;超時或對端主動關閉,返回值等於0;成功時,返回值是返回發送數據的長度。
一般通信的報文的格式:報文頭 + 報文體,那么針對這種格式的報文怎么樣接收最合理?
巧用while+recv
方法:先接收報文頭,直到接收報文的長度和定義的報文頭長度相同,然后接收報文體,直到報文體的長度和報文頭里面寫明的長度相同,如下所示:
iAlready = 0; ulRecvLen = HEAD_LENGTH; char pcFrame[HEAD_LENGTH] = {0x0}; while(iAlready < ulRecvLen) { iResult = recv(socket, pcFrame + iAlready, ulRecvLen - iAlready, 0); if(iResult <= 0) { // 異常處理 } iAlready += iResult; }
報文頭的接收方式和報文的接收方式相同。
巧用while + send
方法:類似while+recv,不同的是發送的時候不區分報文頭和報文體,如下所示:
while(iAlready < dwPkgLength) { iResult = send(socket, pPkg + iAlready, dwPkgLength - iAlready, 0); if(iResult <= 0) { // 異常處理 } iAlready += iResult; }