+ -
当前位置:首页 → 问答吧 → recv函数报10054错误

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错误。

大虾有解决方案么?

作者: cstdingjw   发布时间: 2011-07-25

看这个错误,怎么像windows系统的

作者: justkk   发布时间: 2011-07-25

是的,这个是我在Windows上写的,用GCC编译的,FD_ZERO 等于 memset.10054 linux 上也经常报这个错误,网上说服务器断连.

作者: cstdingjw   发布时间: 2011-07-26