此问题已经问过,不过仍然没有解决!!,忍痛新开贴!
背景:
1、client端采用阻塞模式给server发数据(设置超时5秒);
2、server端采用网络事件触发来接收client端的数据!client端代码框架:
while(第一种包没有发完)
{
sendto(local,buf....)
read=recvfrom(local,AckBuf....)
if(read>0)
{
处理收到的数据;
}
}
while(第二种包没有发完)
{
sendto(local,buf....)
read=recvfrom(local,AckBuf....)
if(read>0)
{
处理收到的数据;
} }
......
......
}
现象:
1、client端,采用“一发一收”也就是:
while(包没有发完)
{
sendto(local,buf....)
recvfrom(local,AckBuf....)
......
......
}
在server端只能收到第一个包,后续的包就收不到!!!
2、如果客户端光发不收,server端就能收到client端的所有包,怀疑是recvfrom的问题?!! 3、但是client端跟踪调试,所有的数据、参数,能看到的东西都是正常的!!!
问:可能是哪里的问题???
背景:
1、client端采用阻塞模式给server发数据(设置超时5秒);
2、server端采用网络事件触发来接收client端的数据!client端代码框架:
while(第一种包没有发完)
{
sendto(local,buf....)
read=recvfrom(local,AckBuf....)
if(read>0)
{
处理收到的数据;
}
}
while(第二种包没有发完)
{
sendto(local,buf....)
read=recvfrom(local,AckBuf....)
if(read>0)
{
处理收到的数据;
} }
......
......
}
现象:
1、client端,采用“一发一收”也就是:
while(包没有发完)
{
sendto(local,buf....)
recvfrom(local,AckBuf....)
......
......
}
在server端只能收到第一个包,后续的包就收不到!!!
2、如果客户端光发不收,server端就能收到client端的所有包,怀疑是recvfrom的问题?!! 3、但是client端跟踪调试,所有的数据、参数,能看到的东西都是正常的!!!
问:可能是哪里的问题???
解决方案 »
- 一个关于fopen的不是网络问题的网络问题
- 马上结贴!!!关于release版本和debug版本名字不一样的问题!(刚才的帖子无法访问)
- Tab Control怎么能这样显示
- MFC程序在除本机外的其他机器上无法运行,怎么回事?详见内容。。
- 做多标签功能软件的疑问,请教大家
- 你找到自己的方向了吗?
- 各位高手,如何实现在按下确定按钮时,而不是按下回车键时,让对话框退出?
- 散分!!!200分!!!!求源程序!!
- 请教高手一个很基础的问题。
- 不知大家遇到过误上了一个网站,IE的标题栏的最后都附加了该站点的URL(亦即原来的“Microsoft Internet Explorer”被替换成它的URL了),而且机器重起后自动启动IE联结该站。怀疑是打开该站的时候注册表被修改了。如何解决?请赐教!
- 潘老师聊天进行中……
- debug状态可以运行的程序在release下不能运行该怎么检查哪?
while(包没有发完)
{
sendto(local,buf....)
recvfrom(local,AckBuf....)
......
......
}
你是说把recvfrom(local,AckBuf....)去掉就发送正常?那么不去掉接收正常吗?
我想可以用下面方法来解决:
增加确认机制,即对每个包都要进行收到确认,如果超过指定时间末收到确认则认为是丢失,你要重发这个包。
recvfrom(local,AckBuf....)两种可能:一是服务器发关回来的数据包丢失了,二是服务器发送数据的这部分有问题
recvfrom(local,AckBuf....)什么意思?!!
我设置了,接收超时啊!!怎么会阻塞呢,况且我调试的时候,也会往下走啊!!!
if(ShareInfoSock==INVALID_SOCKET)
{
AfxMessageBox("ShareInfoSock Create failed!");
closesocket(ShareInfoSock);
} sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(6000);//6000端口
local.sin_addr.s_addr=0;
if(SOCKET_ERROR==bind(ShareInfoSock,(const sockaddr*)&local,sizeof(sockaddr)))
{
AfxMessageBox("ShareInfoSock Bind failed!");
closesocket(ShareInfoSock);
} sockaddr_in ser;
ser.sin_addr.S_un.S_addr=inet_addr("192.168.0.104");
ser.sin_family=AF_INET;
ser.sin_port=htons(SERVER_PORT);
//设置接收数据超时 5秒
int TimeOut = 5000;
::setsockopt(ShareInfoSock, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut));
//...................
//打包数据!
while(包没有发完)//已知文件信息没有发送完!
{
//发送该包
sendto(ShareInfoSock,KnowFilePacket,sizeof(KnowFilePacket),0,(const sockaddr*)&ser,len);
//处理接收回应包!
char cRecvKnowFileAck[4096];
memset(cRecvKnowFileAck,0,4096);
iRead=recvfrom(ShareInfoSock,cRecvKnowFileAck,sizeof(cRecvKnowFileAck),0,(sockaddr*)&ser,&len);
if (iRead>0)
{
处理包;
}
.........