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

这个是服务器的代码:
#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次,两句都接收到的情况大概只有三四次。。求高手。。求专家。。求大神。。感激不尽

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) { ....... }
........
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-12-06
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) { ....... }
........
}
第2个回答  2012-06-02
提示一下吧:
收报本的时候,你得校验接收过来的长度,够不够,够了以后才处理(比如打印出来),如果长度不足就继续等待接收,一直到接收完整为止。这是基本思路。一般在大报文容易出现丢包或者报文不完整的情况。
第3个回答  2012-06-02
我晕追问

???怎么了 是不是有很SB的错误啊 我是菜鸟啊 刚学

socket编程中的接收数据丢失问题
TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。从你的程序来看,客...

socket文件传输为什么数据会丢失
如果是自己设计的网络编程传输,因为socket缓冲区大小和应用层接收速度不一致,就会导致部分数据还没接受完,下一部分数据又到来。可以设计一个方法来确保数据一致。网页链接 typedef struct { int len; \/\/buf里面存放的数据长度 char buf[128];}data,*pdada;先发送服务器端读文件会返回读到的字节数,...

利用qt tcpsocket接受大数据包,但是数据只能接受至5k,之后的数据丢失严 ...
对于大数据包 建议还是分段传送 也就是你要自己写一个关于发送接收的协议 一次性读取或者发送是一个不太好的做法 虽然TCP在发送过程中会有数据的验证什么的 但是如果缓冲区一下子就满了 起始还是会丢失部分数据的 建议分段发送跟分段接收 既由客户端来决定发送的频率 (假定1M的数据包 分段称8K的一...

linux socket发送端发送太快,接收端会数据丢失?
不会啊,以前我试过用循环发送啊,不需要等待,而且能实时发送。不过我是用c语言写的服务器和客户端,伪代码的话那个函数可能封装了其他工能导致无法及时接受

多线程读写socket导致的数据混乱的原因是什么?
1. 写入顺序问题:多个线程同时向同一个 socket 写入数据时,写入的顺序可能会混乱。这意味着数据可能以不同的顺序到达目标。2. 读取\/写入冲突:当一个线程正在读取 socket 数据的同时,另一个线程可能会尝试写入数据。由于读写操作之间没有同步机制,可能会导致数据丢失、覆盖或交叉。3. 缓冲区溢出:...

socket接收数据出错
方法一:定义一个MsgObject的消息类,里面存放的为发送的消息内容(记得序列化)。然后再用ObjectOutputStream来把该类弄成一个输出流发送出去。然后客户端就用 ObjectInputStream in=new ObjectInputStream(socket.getInputStream());MsgObject obj=(MsgObject)in.getObject();就能够得到一个消息类对象了...

socket丢包怎么解决
那么客户端收到的数据就会比理论应该收到的少,就会造成丢数据,丢包的现象。这种现象,其实本质上来说不是丢包,也不是丢数据,只是因为程序处理有错误,导致有些数据没有成功地被socket发送出去。常用的解决方法如下:拆包、加包头、发送,组合包,如果客户端、服务端掉线,常采用心跳测试。

socket 编程频繁使用 send 函数为什么会出现丢包的现象
如果不一致,那就是没有拷贝进入发送的缓冲区,所以没有发出去。另外,不知道你是怎么检测到的丢包现象。如果你不是用的Wireshark之类的嗅探器进行数据包的截获和查看,那么还有一个可能,就是数据实际上已经发出去了,但是因为数据量比较大,一次没有办法收回来,所以你以为是丢包了。

Socket为什么被关闭?
Socket closed可能导致数据丢失。当Socket被关闭时,正在传输的数据可能没有被完全发送或接收。这样会导致数据丢失的风险,因此在编写网络应用程序时,必须要对数据完整性进行保护,例如使用校验和或其他的数据检验机制。此外,通常需要在应用程序中记录日志,以便在发生错误时进行调试和排查。

多线程读写socket导致的数据混乱的原因是什么?
蓝海大脑作为深度学习、高性能计算研究领域研究专家认为:多线程读写socket导致数据混乱的原因可能是由于多个线程同时读写同一个socket导致的竞争条件。当多个线程尝试同时读写相同的socket时,它们可能会相互干扰并导致数据混乱或丢失。这种情况下的解决方法是使用线程同步机制来确保每个线程在访问socket时都按...

相似回答