recv函数报10054错误
时间:2011-07-25
来源:互联网
各位大虾:
我写linux服务端,利用recv函数进行接收.但服务端总是receive失败.报10054 WSAECONNRESET错误,网上说服务端自动关闭。
我的服务端与客户端是放在同一台电脑上的。
相关代码如下:
/*The Windows sockets listen function places a socket
*a stace where it is listening for an incoming connection*/
/*accept a connection*/
SOCKET nClientSocket = INVALID_SOCKET;
BOOLEAN bIsInSet = NO;
struct fd_set set;
struct fd_set all_set;
struct timeval timeout;
memset(&set,0,sizeof(fd_set));
memset(&all_set,0,sizeof(fd_set));
memset(&timeout,0,sizeof(timeval));
timeout.tv_sec = MAX_SELECT_TIME;
timeout.tv_usec = 0;
/*Add the listening socketing into the socket set*/
CServer::FDZero(&set);
CServer::FDSet(pServer->m_nListenSocket,&all_set);
set = all_set;
/*loop*/
while(YES == pServer->m_bRunning)
{
set = all_set;
nRet = select(pServer->m_nListenSocket+1,&set,(fd_set*)0,(fd_set*)0,(struct timeval*)&timeout);
if(SOCKET_ERROR != nRet && 0 != nRet)
{
/*put a socket into a list*/
WaitForSingleObject(pServer->m_hMutex,INFINITE);
for(UINT32 i = 0;i < set.fd_count;i++)
{
/*Initialize the variable*/
/*Check where i does exist in the set indeed*/
bIsInSet = CServer::FDIsSet(set.fd_array[i],&set);
if(YES == bIsInSet)
{
/*A new client connection*/
/*If i is father,that will deverid children*/
if(set.fd_array[i] == (UINT32)pServer->m_nListenSocket)
{
INT nClientSockLen = sizeof(sockaddr_in);
nClientSocket = accept(pServer->m_nListenSocket,(struct sockaddr*)&client_addr,&nClientSockLen);
if(INVALID_SOCKET != nClientSocket)
{
/*Doesn't know this sentence's function*/
if(set.fd_count < FD_SETSIZE)
{
ULONG nArgs = 0;
ioctlsocket(set.fd_array[i],FIONBIO,&nArgs);
CServer::FDSet(nClientSocket,&all_set);
}
else
{
WRITELOG(LOG_OPEN,"%s""CServer::ListenThread() select pool exceeds socket array size");
}
}
else
{
/*Accept the socket error*/
WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() select pool accept socket error");
}
}
else
{
/*Add the socket to list*/
/*Where the client if offline,what do I do?*/
/*Handle Rtsp Message*/
CHAR szRecvBuf[MAX_BUF_SIZE] = {0};
/*Peek message,check the message is legal*/
nRet = recv(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);
if(0 < nRet)
{
/*recv rtsp message successfully*/
CServer* pServer = CServer::m_pInstance;
pServer->m_listSocket.Add(set.fd_array[i]);
}
else if(0 == nRet)
{
/*client shuts down*/
WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() client must shutdown failed");
CServer::FDClr(set.fd_array[i],&all_set);
}
else
{
/*network failed*/
INT32 error = WSAGetLastError();
WRITELOG(LOG_OPEN,"CServer::ListenThread() the connection is broken down[%d][%s]",
error,strerror2(error));
//CServer::FDClr(set.fd_array[i],&set);
CServer::FDClr(set.fd_array[i],&all_set);
}
}
}
}
ReleaseMutex(pServer->m_hMutex);
}
else if(0 == nRet)
{
//INT32 error = WSAGetLastError();
//WRITELOG(LOG_OPEN,"CServer::ListenThread() time limit expired[%d][%s]",error,strerror2(error));
}
else
{
INT32 error = WSAGetLastError();
WRITELOG(LOG_OPEN,"CServer::ListenThread() select pool error[%d][%s]",error,strerror2(error));
break;
}
Sleep(MAX_SLEEP_TIME);
其中 strerror2 这个函数是我自己实现的。
代码在 :
nRet = recv(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);
报错,我是利用两级 select I/O 复用,所以上面用 msg_peek没有用参数0。
但 recv 收到一定数目消息后,挂掉。报 10054 WSAECONNRESET错误。
大虾有解决方案么?
我写linux服务端,利用recv函数进行接收.但服务端总是receive失败.报10054 WSAECONNRESET错误,网上说服务端自动关闭。
我的服务端与客户端是放在同一台电脑上的。
相关代码如下:
/*The Windows sockets listen function places a socket
*a stace where it is listening for an incoming connection*/
/*accept a connection*/
SOCKET nClientSocket = INVALID_SOCKET;
BOOLEAN bIsInSet = NO;
struct fd_set set;
struct fd_set all_set;
struct timeval timeout;
memset(&set,0,sizeof(fd_set));
memset(&all_set,0,sizeof(fd_set));
memset(&timeout,0,sizeof(timeval));
timeout.tv_sec = MAX_SELECT_TIME;
timeout.tv_usec = 0;
/*Add the listening socketing into the socket set*/
CServer::FDZero(&set);
CServer::FDSet(pServer->m_nListenSocket,&all_set);
set = all_set;
/*loop*/
while(YES == pServer->m_bRunning)
{
set = all_set;
nRet = select(pServer->m_nListenSocket+1,&set,(fd_set*)0,(fd_set*)0,(struct timeval*)&timeout);
if(SOCKET_ERROR != nRet && 0 != nRet)
{
/*put a socket into a list*/
WaitForSingleObject(pServer->m_hMutex,INFINITE);
for(UINT32 i = 0;i < set.fd_count;i++)
{
/*Initialize the variable*/
/*Check where i does exist in the set indeed*/
bIsInSet = CServer::FDIsSet(set.fd_array[i],&set);
if(YES == bIsInSet)
{
/*A new client connection*/
/*If i is father,that will deverid children*/
if(set.fd_array[i] == (UINT32)pServer->m_nListenSocket)
{
INT nClientSockLen = sizeof(sockaddr_in);
nClientSocket = accept(pServer->m_nListenSocket,(struct sockaddr*)&client_addr,&nClientSockLen);
if(INVALID_SOCKET != nClientSocket)
{
/*Doesn't know this sentence's function*/
if(set.fd_count < FD_SETSIZE)
{
ULONG nArgs = 0;
ioctlsocket(set.fd_array[i],FIONBIO,&nArgs);
CServer::FDSet(nClientSocket,&all_set);
}
else
{
WRITELOG(LOG_OPEN,"%s""CServer::ListenThread() select pool exceeds socket array size");
}
}
else
{
/*Accept the socket error*/
WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() select pool accept socket error");
}
}
else
{
/*Add the socket to list*/
/*Where the client if offline,what do I do?*/
/*Handle Rtsp Message*/
CHAR szRecvBuf[MAX_BUF_SIZE] = {0};
/*Peek message,check the message is legal*/
nRet = recv(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);
if(0 < nRet)
{
/*recv rtsp message successfully*/
CServer* pServer = CServer::m_pInstance;
pServer->m_listSocket.Add(set.fd_array[i]);
}
else if(0 == nRet)
{
/*client shuts down*/
WRITELOG(LOG_OPEN,"%s","CServer::ListenThread() client must shutdown failed");
CServer::FDClr(set.fd_array[i],&all_set);
}
else
{
/*network failed*/
INT32 error = WSAGetLastError();
WRITELOG(LOG_OPEN,"CServer::ListenThread() the connection is broken down[%d][%s]",
error,strerror2(error));
//CServer::FDClr(set.fd_array[i],&set);
CServer::FDClr(set.fd_array[i],&all_set);
}
}
}
}
ReleaseMutex(pServer->m_hMutex);
}
else if(0 == nRet)
{
//INT32 error = WSAGetLastError();
//WRITELOG(LOG_OPEN,"CServer::ListenThread() time limit expired[%d][%s]",error,strerror2(error));
}
else
{
INT32 error = WSAGetLastError();
WRITELOG(LOG_OPEN,"CServer::ListenThread() select pool error[%d][%s]",error,strerror2(error));
break;
}
Sleep(MAX_SLEEP_TIME);
其中 strerror2 这个函数是我自己实现的。
代码在 :
nRet = recv(set.fd_array[i],szRecvBuf,MAX_BUF_SIZE,MSG_PEEK);
报错,我是利用两级 select I/O 复用,所以上面用 msg_peek没有用参数0。
但 recv 收到一定数目消息后,挂掉。报 10054 WSAECONNRESET错误。
大虾有解决方案么?
作者: cstdingjw 发布时间: 2011-07-25
看这个错误,怎么像windows系统的
作者: justkk 发布时间: 2011-07-25
是的,这个是我在Windows上写的,用GCC编译的,FD_ZERO 等于 memset.10054 linux 上也经常报这个错误,网上说服务器断连.
作者: cstdingjw 发布时间: 2011-07-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28