socket编程中的接收数据丢失问题

这个是服务器的代码:#defineMAX_BUFLEN1024*256main(intac,char*av[]){intsock;intsock_fd;intretval... 这个是服务器的代码:
#define MAX_BUFLEN 1024*256
main(int ac, char *av[])
{
int sock;
int sock_fd;
int retval,retvals;
char buf[MAX_BUFLEN],buf2[MAX_BUFLEN];
sock = make_server_socket();//这里调用socket();bind();listen()等函数;
while(1)
{
sock_fd = accept( sock, NULL, NULL);
retval = recv( sock_fd, buf, MAX_BUFLEN, 0 );
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
}

这里是客户端:
int main()
{
int sockfd;
int a, b;
char buf[1024];
sockfd = connect_to_server("192.168.1.28",12345);//这里调用socket();connect();等函数,连接服务器。
a = write(sockfd,"#####helloworld\n",sizeof("#####helloworkd\n")-1);
b = write(sockfd,"#####whatisit\n",sizeof("#####whatisit\n")-1);
printf("a= %d b=%d\n",a,b);
return 0;
}
结果是这样。我客户端向服务器发送了两次数据,而且客户端的打印显示两次数据都发送成功了,###但是服务器那端发生了诡异事情,服务器大部分时间是只接受到第一次发送的数据,也就是“####helloworld\n”,然后少部分时间是两句都接收到了,我运行了大概30次,两句都接收到的情况大概只有三四次。。求高手。。求专家。。求大神。。感激不尽
展开
 我来答
阔海的账户
2012-06-02 · TA获得超过214个赞
知道小有建树答主
回答量:161
采纳率:0%
帮助的人:240万
展开全部
TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。
从你的程序来看,客户端连续发送2包数据,服务器端有可能一次就全部接到,也可能分2次收到,也可能会收2次以上才能收到。如果在发送“########helloworld”和“######whatisit”之间增加一些延时语句,比如延时1秒,那么可以肯定服务器端只能收到1次,因为在发送第1包数据的时候,服务器端就接收到一次数据,而在发送第2包数据时,服务器已经不再有接收动作了。
就现在的客户端程序来说,如果要在服务器端收到所有数据,可以考虑在服务器端循环接收数据,拼装数据,直到收不到数据为止,然后输出所有接收到的数据。
while(1)
{
int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
while(1)
{
rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );
if(rr==0) break;
memcpy(buf+retval,buf1,rr);
retval+=rr;
}
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
可以试试看。仅供参考。

查到个函数ioctlsocket
while(1)
{ int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
int iMode = 1; //0:阻塞
ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置
while(1) { ....... }
........
}
百度网友5d1a1bbdc
2015-12-06 · 超过10用户采纳过TA的回答
知道答主
回答量:63
采纳率:100%
帮助的人:23.9万
展开全部
TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。
从你的程序来看,客户端连续发送2包数据,服务器端有可能一次就全部接到,也可能分2次收到,也可能会收2次以上才能收到。如果在发送“########helloworld”和“######whatisit”之间增加一些延时语句,比如延时1秒,那么可以肯定服务器端只能收到1次,因为在发送第1包数据的时候,服务器端就接收到一次数据,而在发送第2包数据时,服务器已经不再有接收动作了。
就现在的客户端程序来说,如果要在服务器端收到所有数据,可以考虑在服务器端循环接收数据,拼装数据,直到收不到数据为止,然后输出所有接收到的数据。
while(1)
{
int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
while(1)
{
rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );
if(rr==0) break;
memcpy(buf+retval,buf1,rr);
retval+=rr;
}
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
可以试试看。仅供参考。

查到个函数ioctlsocket
while(1)
{ int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
int iMode = 1; //0:阻塞
ioctlsocket(sock_fd,FIONBIO, (u_long FAR*) &iMode);//非阻塞设置
while(1) { ....... }
........
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
机器猫的原创
2012-06-02 · TA获得超过173个赞
知道小有建树答主
回答量:210
采纳率:100%
帮助的人:81.1万
展开全部
提示一下吧:
收报本的时候,你得校验接收过来的长度,够不够,够了以后才处理(比如打印出来),如果长度不足就继续等待接收,一直到接收完整为止。这是基本思路。一般在大报文容易出现丢包或者报文不完整的情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-06-02
展开全部
我晕
追问
???怎么了  是不是有很SB的错误啊    我是菜鸟啊  刚学
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式