日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言recv函数返回值,谈谈recv()函数的返回值

發(fā)布時(shí)間:2025/3/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言recv函数返回值,谈谈recv()函数的返回值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)上某論壇有這樣一個(gè)問題:當(dāng)recv()函數(shù)的返回值為0時(shí),能不能在接收端不關(guān)閉套接字,以便這條建立好的C/S通信下次可以直接使用?

我對(duì)這個(gè)問題的回答是:不能。

原因是:此時(shí)即使接收端不關(guān)閉套接字,發(fā)送端也已經(jīng)關(guān)閉相應(yīng)的套接字,這條連接需要從accept()/connect()兩個(gè)函數(shù)這里重新建立。

測(cè)試代碼如下:

#include "stdafx.h"

#include

#include

#pragma comment(lib,"ws2_32")

const int m_listen_port=9923;

#define buff_size 1024

int main(int argc, char* argv[])

{

int ret_common=0;

int ret_error=0;

WSAData wsadata;

WORD m_version;

m_version=MAKEWORD(2,2);

WSAStartup(m_version,&wsadata);

SOCKET

m_server_sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if (m_server_sock==INVALID_SOCKET)

{

ret_error=WSAGetLastError();

printf("error for

socket() and caputre error code: %d\n",ret_error);

return 0;

}

SOCKADDR_IN m_sock_addr;

memset(&m_sock_addr,0,sizeof(m_sock_addr));

m_sock_addr.sin_family=AF_INET;

m_sock_addr.sin_addr.S_un.S_addr=INADDR_ANY;

m_sock_addr.sin_port=htons(m_listen_port);

ret_common=bind(m_server_sock,(SOCKADDR*)&m_sock_addr,sizeof(m_sock_addr));

if (ret_common==SOCKET_ERROR)

{

ret_error=WSAGetLastError();

printf("error for

bind() and caputre error code: %d\n",ret_error);

return 0;

}

listen(m_server_sock,SOMAXCONN);

fd_set fd_socket;

FD_ZERO(&fd_socket);

FD_SET(m_server_sock,&fd_socket);

while (1)

{

fd_set

fd_read=fd_socket;

ret_common=select(0,&fd_read,NULL,NULL,NULL);

if

(ret_common>0)

{

for

(unsigned int i=0;i

{

BOOL

m_boolen_ret=FD_ISSET(fd_socket.fd_array[i],&fd_read);

if

(m_boolen_ret)

{

if

(fd_socket.fd_array[i]==m_server_sock)

{

SOCKADDR_IN

m_client_addr;

memset(&m_client_addr,0,sizeof(m_client_addr));

int

m_client_addr_len=sizeof(m_client_addr);

SOCKET

m_client_sock=accept(m_server_sock,(SOCKADDR*)&m_client_addr,&m_client_addr_len);

printf("accpet

a connection from socket %d\n",m_client_sock);

FD_SET(m_client_sock,&fd_socket);

}

else

{

char

m_recv_buff[buff_size];

memset(m_recv_buff,0,buff_size);

ret_common=recv(fd_socket.fd_array[i],m_recv_buff,sizeof(m_recv_buff),0);

if

(ret_common>0)// 接收數(shù)據(jù)包正常,數(shù)據(jù)包中的數(shù)據(jù)大于0個(gè)字節(jié);

{

printf("receive

data \"%s\" from socket

%d\n",m_recv_buff,fd_socket.fd_array[i]);

continue;

}

else

if

(ret_common==0)//?傳輸數(shù)據(jù)包操作完成,連接斷開(gracefully);

{

ret_error=WSAGetLastError();

printf("there

is a connection is gracefully closed and capture error code:

%d,socket:%d\n",

ret_error,fd_socket.fd_array[i]);

closesocket(fd_socket.fd_array[i]);

FD_CLR(fd_socket.fd_array[i],&fd_socket);?continue;

}

else//

傳輸數(shù)據(jù)包出錯(cuò);

{

ret_error=WSAGetLastError();

closesocket(fd_socket.fd_array[i]);

FD_CLR(fd_socket.fd_array[i],&fd_socket);

if

(ret_error==10054)// 連接被強(qiáng)制斷開;

{

printf("client

closed the connection by force, test ret_common:

%d,socket:%d\n",

ret_error,ret_common,fd_socket.fd_array[i]);

}

else//

輸出其它錯(cuò)誤;

{

printf("error

for recv(), capture error code: %d, test ret_common:

%d,socket:%d\n",

ret_error,ret_common,fd_socket.fd_array[i]);

}?continue;

}

}

}

}?}

else

{

ret_error=WSAGetLastError();

printf("error

for select() and capture error code: %d\n",ret_error);

break;

}

}

closesocket(m_server_sock);

WSACleanup();

return 0;

}

這段發(fā)送端代碼不是我寫的,看起來可能比較亂,請(qǐng)見諒:

for (int i=0;i<10;i++)

{

strncpy(m_send_buff,"data",sizeof("data"));

char a[20];

memset(a,0,20);

itoa(i+1,a,10);

strncat(m_send_buff,a,20);

ret_common=send(s,m_send_buff,sizeof(m_send_buff),0);

if

(ret_common==SOCKET_ERROR)

{

ret_error=WSAGetLastError();

printf("error

for send() and capture error code: %d\n",ret_error);

break;

}

else

{

printf("send

data: %s\n",m_send_buff);

}

Sleep(1000);

}

Sleep(6000);

// 關(guān)閉套節(jié)字

::closesocket(s);

Sleep(10000);

printf("ret\n");

return 0;

當(dāng)包含這段代碼的程序發(fā)送數(shù)據(jù)包到包含上一段代碼的程序時(shí),發(fā)送數(shù)據(jù)完畢,在等6秒鐘后發(fā)送數(shù)據(jù)的套接字才關(guān)閉,而接收端也是等6秒鐘才輸出客戶端關(guān)閉(gracefully)關(guān)閉的信息,再等10描述,發(fā)送數(shù)據(jù)的程序才推出。

總結(jié)一下:

(1)當(dāng)接收端被強(qiáng)行關(guān)閉時(shí),ret_common為-1,WSAGetLastError()返回值(即ret_error)為10054(0x2746);

(2)當(dāng)數(shù)據(jù)傳輸執(zhí)行closesocket()(closesocket()參數(shù)為發(fā)送數(shù)據(jù)的套接字)之后,接收端的返回值(即ret_common)為0。

(3)在傳輸過程中,如果接收端被強(qiáng)行關(guān)閉,那么發(fā)送端的send()函數(shù)的返回值(即ret_common)為-1,WSAGetLastError()的返回值(即ret_error)為10054(0x2746)。

需要注意一點(diǎn):

WSAGetLastError()的返回值:10054,與GetLastError()的返回值:0x2746,這兩個(gè)錯(cuò)誤返回值是相等的(不同的是針對(duì)WSAGetLastError()函數(shù)和GetLastError()函數(shù)的返回值類型不同(WSAGetLastError()返回int類型操作數(shù);GetLastError()返回DWORD類型操作數(shù)))。

總結(jié)

以上是生活随笔為你收集整理的c语言recv函数返回值,谈谈recv()函数的返回值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。