为什么收不到有些客户端发来的数据啊?

chenjunge 2011-05-19 04:17:15
为什么收不到有些客户端发来的数据啊?部分代码如下:
WSADATA wsaData;
nRet = WSAStartup(MAKEWORD(2,2), &wsaData);
if(nRet != NO_ERROR)
{
err = WSAGetLastError();
return -1;
}

//创建监听socket
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(ListenSocket == INVALID_SOCKET)
{
err = WSAGetLastError();
WSACleanup();
return -1;
}

int port = 8001;
int iAddrSize;
//添地址
sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = htonl(INADDR_ANY);//inet_addr("127.0.0.1");
local.sin_port = htons(port);

iAddrSize = sizeof(local);
//绑定
if(bind(ListenSocket, (SOCKADDR*)&local, iAddrSize) == SOCKET_ERROR)
{
err = WSAGetLastError();
closesocket(ListenSocket);
WSACleanup();
return -1;
}

//开始侦听
if(listen(ListenSocket, SOMAXCONN) != 0)
{
err = WSAGetLastError();
closesocket(ListenSocket);
WSACleanup();
return -1;
}

while (1)
{
// 创建一个接受连接请求的端口

SOCKET* pClient = new SOCKET;
*pClient = accept(ListenSocket, (SOCKADDR*)&local,&iAddrSize);
if(*pClient == INVALID_SOCKET)
{
err = WSAGetLastError();
closesocket(ListenSocket);
WSACleanup();
return -1;
}

DWORD dwCheckOnlineStatusThreadID1;
//ClientSocket = AcceptSocket;

SClientSocketInfo *pClientSocketInfo=new SClientSocketInfo;

pClientSocketInfo->ClientSocket= *pClient;
pClientSocketInfo->csIp = csStationIp;
pClientSocketInfo->csPort = csStationPort;

m_DbAdmin->m_ListClientSocketInfo.AddHead(pClientSocketInfo);

m_hCheckOnlineStatusThread1 = CreateThread(NULL,0,CallBackCheckOnlineStatus1,this,0,&dwCheckOnlineStatusThreadID1);
if(m_hCheckOnlineStatusThread1 == NULL)
{
//AfxMessageBox("创建在线检测线程失败!");
closesocket(ListenSocket);
WSACleanup();
return -1;
}
}
closesocket(ListenSocket);
WSACleanup();



DWORD WINAPI CallBackCheckOnlineStatus1(LPVOID lpParameter ) // thread data
{
CDoc *pDoc = (CDoc*)lpParameter;

int iResult, iSendResult;
unsigned char buf[21];
int len = 21;
memset(buf,0,len);


POSITION pos = pDoc->m_DbAdmin->m_ListClientSocketInfo.GetHeadPosition();
while(pos != NULL)
{
SClientSocketInfo *pClientSocketInfo = (SClientSocketInfo*)pDoc->m_DbAdmin->m_ListClientSocketInfo.GetNext(pos);

sockaddr_in ClientLocal;
int iClientAddrSize = sizeof(ClientLocal);
iResult = getpeername(pClientSocketInfo->ClientSocket , (SOCKADDR*)&ClientLocal,&iClientAddrSize);
//sprintf((char *)buf, "客户端的IP地址:%s,端口号:%d ", inet_ntoa(ClientLocal.sin_addr),ntohs(ClientLocal.sin_port));
if (0 == iResult)
{
iResult = recv(pClientSocketInfo->ClientSocket,(char *)buf, len, 0);
if (iResult > 0)
{
}
closesocket(pClientSocketInfo->ClientSocket);
WSACleanup();

//delete pClientSocketInfo;
}


return FALSE;
}
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhxs123 2011-05-27
  • 打赏
  • 举报
回复
我也有遇到 过这个问题,你可试试看是不是数据类型不对,有时候char型数据要以/0结尾才能正确读出
oyljerry 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chenjunge 的回复:]
是有丢包,同一个客户端,有时能收到数据有时不能,监听端口应该没问题,可能是accept和处理线程的问题,还有accept 的socket的保存问题
[/Quote]
添加一些调试Log输出等分析定位问题
Eleven 2011-05-26
  • 打赏
  • 举报
回复
客户端是否正常连接上服务端了?
西湖秀才 2011-05-26
  • 打赏
  • 举报
回复
恩,抓包试试!
chenjunge 2011-05-19
  • 打赏
  • 举报
回复
是有丢包,同一个客户端,有时能收到数据有时不能,监听端口应该没问题,可能是accept和处理线程的问题,还有accept 的socket的保存问题
Career2011 2011-05-19
  • 打赏
  • 举报
回复
代码很复杂,,,看起来头痛。。。。
收不到有些客户端发来的数据?也就是说有的客户端是正常的?如果有的客户端都连接不上,那么估计就是客户端的问题了。不在同一个网内,还是怎么回事?
如果accept到了,却无法通信,,,就奇怪了
bragi523 2011-05-19
  • 打赏
  • 举报
回复
抓包看下,是否连接成功,是否有数据发过来等
nostopstep 2011-05-19
  • 打赏
  • 举报
回复
使用telnet命令来登录一下你的服务端的端口,看能否登上,如果能,你就设置断点跟一下,应该很容易跟出来,如果不能,则说明你服务端的监听端口有问题;

18,356

社区成员

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

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