多线程的socket 客户端 总是接收不到
ar996 2011-12-15 08:46:35 客户端是一个dll,程序通过多线程调用dll里的函数向服务器发送数据,
现在发现 线程只有一个 偶尔有两个返回调用成功,其它的在接收数据的时候就发生错误了,但是数据已经都发出去了 。
SOCKET fSocket::Connect(char *szIP,UINT nPort)
{
SOCKET hSocket = INVALID_SOCKET;
clock_t start,ends;
//没有初始化,则要重新初始化
if (!m_SocketInstalled ) return INVALID_SOCKET;
//测试网络是否畅通
if (!Ping(szIP))
{
TRACE(_T("Ping failed\n"));
closesocket(hSocket);
hSocket = INVALID_SOCKET;
return hSocket;
}
start = clock();
ends = clock();
//创建SOCKET
while ((hSocket == INVALID_SOCKET) && ((ends - start)<m_szTimeOut))
{
if ((hSocket=socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
TRACE(_T("Create socket failed\n"));
hSocket = INVALID_SOCKET;
return hSocket;
}
ends = clock();
}
if (hSocket == INVALID_SOCKET)
return hSocket;
SetTimeOut(hSocket,m_szTimeOut);
linger m_sLinger;
m_sLinger.l_onoff = 1; // (在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
m_sLinger.l_linger = 0; // (容许逗留的时间为0秒)
u_long ul =1;
setsockopt(hSocket,SOL_SOCKET,SO_LINGER,(char*)&m_sLinger,sizeof(linger));
//填充 client struct
struct sockaddr_in addr;
ZeroMemory((char *)&addr,sizeof(addr));
CopyMemory((char *)&(addr.sin_addr),(char *)&serveraddr,sizeof(addr.sin_addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(nPort);
// unsigned long ul=1;
if (connect(hSocket,(struct sockaddr *)&addr,sizeof(addr)) == SOCKET_ERROR)
{
DisConnect(hSocket);
TRACE(_T("connect failed\n"));
hSocket = INVALID_SOCKET;
return hSocket;
}
return hSocket;
}
BOOL fSocket::RecvData(SOCKET hSocket,LPVOID lpData,short nSize)
{
if (hSocket == INVALID_SOCKET) return false;
int nLen,nRet,nError;
fd_set fds;
clock_t tmStart,tmEnd;
CString str;
//设置检测状态,等待时间为1秒
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec= 0;
tmStart = clock();
nLen = 0;
while(nLen < nSize)
{
//检测侦听SOCKET的状态
FD_ZERO(&fds);
FD_SET(hSocket,&fds);
nError=::select((int)hSocket+1,&fds,NULL,NULL,&timeout);
//发生错误
if (nError == SOCKET_ERROR)
{
TRACE(_T("Recv select = SOCKET_ERROR"));
//断开连接
DisConnect(hSocket);
return false;
}
//无数据
if (nError == 0)
{
tmEnd = clock();
if (m_szTimeOut > 0 && ((tmEnd - tmStart) >= m_szTimeOut))
{
//
TRACE(_T("Recv select = 0 "));
DisConnect(hSocket);
return false;
}
else continue;
}
if (FD_ISSET(hSocket, &fds))
{
nRet = ::recv(hSocket,(char *)lpData+nLen,nSize-nLen,0);
if (nRet == SOCKET_ERROR)
{
TRACE(_T("recv = SOCKET_ERROR"+ str));
return false;
}
nLen += nRet;
}
}
return true;
}
其它的线程总是 提示 Recv select = 0
服务器端显示 要发送多少数据 已经发送0 。
对 c++不太懂 ,大家帮帮忙