socket.recieve阻塞的问题

问题描述

socket服务端接收数据,用循环一段段的接收,在循环里判断报文头记录的长度和实际接收的长度相同时则跳出循环,现在我困惑的是如果发生丢包即两者长度不等时,receive方法就一直阻塞。我是新起的线程去接收数据的。我想弄明白如果阻塞的话要怎么处理,设置接收的超时时间吗?

解决方案

解决方案二:
tcp,理论上是不会丢包的,除非是接收频率过低,导致缓冲区溢出udp,应该当作肯定会丢1次包来处理,如果你要保证数据完整性,就要设计自己的协议
解决方案三:
引用1楼Poopaye的回复:

tcp,理论上是不会丢包的,除非是接收频率过低,导致缓冲区溢出udp,应该当作肯定会丢1次包来处理,如果你要保证数据完整性,就要设计自己的协议

那如果发生接收阻塞要怎么处理,我这个是TCP协议
解决方案四:
异步..或者直接下载一个框架用就行了..自己开发很累而且很多异常问题
解决方案五:
首先,tcp是基于流的,理论上不会丢包(如1楼所说),不可能你前面收不到而收到后面其次,你的问题是你因为收不到包头里记录的指定的长度,所以一直等待,这个问题你应该设置接收超时,如果在网络正常的情况下一直出现这个问题,则要么是你的程序问题,要么是对方的程序问题。
解决方案六:
引用2楼W_wjl1900的回复:

那如果发生接收阻塞要怎么处理,我这个是TCP协议

Recieve方法就是阻塞式的,收到数据才会返回,我不明白你说的处理是什么?

时间: 2024-12-21 15:33:33

socket.recieve阻塞的问题的相关文章

急求socket编程阻塞问题

问题描述 急求socket编程阻塞问题 我想做个测试,用cs模式,从客户端传一个对象给服务器,服务器修改这个对象的属性,再传回客户端.但是出了个问题.客户端运行到ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());这一行时,停住了. 服务器端也是运行到ObjectInputStream ois= new ObjectInputStream(socket.getInputStream());这一行停住了. 请

wsaewouldblock-vc socket 非阻塞 异步通信 conncect 返回值为WSAEWOULDBLOCK(10035L)

问题描述 vc socket 非阻塞 异步通信 conncect 返回值为WSAEWOULDBLOCK(10035L) vc socket 实现 非阻塞异步通信,在两PC机断开网线的情况下,客户端在connect执行完毕后,返回值不为0,通过WSAGetLastError();总是返回WSAEWOULDBLOCK(10035L)和WSAEALREADY(10037L):在连接网线的情况下,总是先返回WSAEWOULDBLOCK(10035L),然后返回WSAEISCONN(10056L):在连接

看到关于socket非阻塞模式设置方式记录一下。

关于socket的阻塞与非阻塞模式以及它们之间的优缺点,这已经没什么可言的:我打个很简单的比方,如果你调用socket send函数时: 如果是阻塞模式下: send先比较待发送数据的长度len和套接字s的发送缓冲的长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR:如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么

【Python之旅】第五篇(二):Python Socket单线程+阻塞模式

 前面第五篇(一)中的一个Socket例子其实就是单线程的,即Server端一次只能接受来自一个Client端的连接,为了更好的说明socket单线程和阻塞模式,下面对前面的例子做修改. 1.单线程+阻塞+交互式     前面的例子是单线程阻塞和非交互式的,现在改写为交互式的,即不会执行一次就结束,希望达到的效果是,发送的数据由User输入,然后Server端进行接收. Server端:与上个例子一样,并没有什么变化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

C#中socket.receivefrom阻塞原因

问题描述 C#中socket.receivefrom读取数据时被阻塞了,但是wireshark却抓到了包.这可能是什么原因呢?代码很简单,就以下几句:IPEndPointlocalEndPoint=newIPEndPoint(IPAddress.Any,3000);SocketlocalSocket=newSocket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);localSocket.Bind(localEndPo

Socket的阻塞模式和非阻塞模式

阻塞模式 Windows套接字在阻塞和非阻塞两种模式下执行I/O操作.在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里.相反,在非阻塞模式下,套接字函数会立即返回,而不管I/O是否完成,该函数所在的线程会继续运行. 在阻塞模式的套接字上,调用任何一个Windows Sockets API都会耗费不确定的等待时间.图所示,在调用recv()函数时,发生在内核中等待数据和复制数据的过程. 当调用recv()函数时,系统首先查是否有准备好的数据.如果

Java Socket构建阻塞的TCP通信

1.服务器端 1.创建ServerSocket对象,可在构造子中指定监听的端口: private int port = 8000; private ServerSocket serverSocket; -- serverSocket = new ServerSocket(port); 2.服务器端调用ServerSocket对象的accept()方法,该方法一直监听端口,等待客户的连接请求,如 果接收到一个连接请求,accept()方法就会返回一个Socket对象,这个Socket对象与客户端的

c++关于socket的问题,阻塞,超时

问题描述 c++关于socket的问题,阻塞,超时 本人是写cocos2dx的,这是个跨平台的引擎,需要满足win32,ios和android平台,这里我有几个疑问 关于阻塞,在win32平台下,socket默认是阻塞,connect也是阻塞,但是它是不是有个 默认的超时时间啊,我再win32平台上连接一台关闭的服务器,它会假卡死一会,然后就正常了, 但是在android平台上却一直都是卡死,我想这是不是和linux上的socket有关系呢 解决方案 socket连接超时问题Socket和Inp

php socket 处理不过来数据流,该如何避免(好像是阻塞了)

php socket 处理不过来数据流,该如何处理(好像是阻塞了) 需求:php接受一个硬件往8888端口上发送数据,如果收到后,应socket_send函数返回"\xFA\x01\x01\xFF\xAA\xAA\x00\x01\x00\x00\x00\x00\x00\x01",硬件再接收到socket_send发送的数据后,会"滴"一声,但是问题出现了,一个硬件还好,但是当多个硬件同时连接并同时发送数据时,会出现硬件不能连续的回应(即发出"滴"