c语言recv函数返回值,谈谈recv()函数的返回值
網上某論壇有這樣一個問題:當recv()函數的返回值為0時,能不能在接收端不關閉套接字,以便這條建立好的C/S通信下次可以直接使用?
我對這個問題的回答是:不能。
原因是:此時即使接收端不關閉套接字,發送端也已經關閉相應的套接字,這條連接需要從accept()/connect()兩個函數這里重新建立。
測試代碼如下:
#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)// 接收數據包正常,數據包中的數據大于0個字節;
{
printf("receive
data \"%s\" from socket
%d\n",m_recv_buff,fd_socket.fd_array[i]);
continue;
}
else
if
(ret_common==0)//?傳輸數據包操作完成,連接斷開(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//
傳輸數據包出錯;
{
ret_error=WSAGetLastError();
closesocket(fd_socket.fd_array[i]);
FD_CLR(fd_socket.fd_array[i],&fd_socket);
if
(ret_error==10054)// 連接被強制斷開;
{
printf("client
closed the connection by force, test ret_common:
%d,socket:%d\n",
ret_error,ret_common,fd_socket.fd_array[i]);
}
else//
輸出其它錯誤;
{
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;
}
這段發送端代碼不是我寫的,看起來可能比較亂,請見諒:
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);
// 關閉套節字
::closesocket(s);
Sleep(10000);
printf("ret\n");
return 0;
當包含這段代碼的程序發送數據包到包含上一段代碼的程序時,發送數據完畢,在等6秒鐘后發送數據的套接字才關閉,而接收端也是等6秒鐘才輸出客戶端關閉(gracefully)關閉的信息,再等10描述,發送數據的程序才推出。
總結一下:
(1)當接收端被強行關閉時,ret_common為-1,WSAGetLastError()返回值(即ret_error)為10054(0x2746);
(2)當數據傳輸執行closesocket()(closesocket()參數為發送數據的套接字)之后,接收端的返回值(即ret_common)為0。
(3)在傳輸過程中,如果接收端被強行關閉,那么發送端的send()函數的返回值(即ret_common)為-1,WSAGetLastError()的返回值(即ret_error)為10054(0x2746)。
需要注意一點:
WSAGetLastError()的返回值:10054,與GetLastError()的返回值:0x2746,這兩個錯誤返回值是相等的(不同的是針對WSAGetLastError()函數和GetLastError()函數的返回值類型不同(WSAGetLastError()返回int類型操作數;GetLastError()返回DWORD類型操作數))。
總結
以上是生活随笔為你收集整理的c语言recv函数返回值,谈谈recv()函数的返回值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国王放米粒的C语言程序,云南大学软件学院
- 下一篇: c语言异或加密函数,用异或算法实现文件的