使用recv函數和send函數的技巧


一些述說

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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM