多线程的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++不太懂 ,大家帮帮忙
...全文
116 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
quwei197874 2011-12-18
  • 打赏
  • 举报
回复
用个抓包软件抓包后分析
ar996 2011-12-18
  • 打赏
  • 举报
回复
调试发现 多线程时 服务器 accept 返回的socket 是一样的,但客户端的socket不一样,所以客户接收数据时,网也没有断,但是就是接收不到(因为服务器就没往这个socket 发送数据)
但是多个ip访问时 返回的socket是不一样的,
xqlu2007 2011-12-17
  • 打赏
  • 举报
回复
要在服务器端程序找原因,对方收到后处理的逻辑有问题
jaynaviee 2011-12-16
  • 打赏
  • 举报
回复
刚毕业
导师安排熟悉socket,关注下。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧