winsock tcp 有关问题,200多字节,发送不完整

winsock tcp 问题,200多字节,发送不完整
使用tcp创建的阻塞性socket,从文本文件中读取内容进行发送,
行的长度长短不一,都是200多字节,
每次运行到第十行的时候就会出现发送不完整的问题,
报文长度是247字节,send函数返回也是247,但是用iptool抓包显示只发送了87字节,
之后,剩余的内容开始单字节发送,而且很慢,半天才发送处去一个报文,但每个报文服务端总能及时响应。
请问这是何故?
------解决方案--------------------
为什么要用“阻塞性socket”,这一般只用于教学。我怀疑是不是因为你用这种模式导致接收端无法及时接收。还有检查一下硬件环境。建议你找一些这方面的例子,有很多现成的socket模型可以用,网上的资料也很多。用别人的代码试试。
------解决方案--------------------
MSS(最大报文段段)是多少?估计是IP分片而已.
------解决方案--------------------
引用
之后,剩余的内容开始单字节发送,而且很慢,半天才发送处去一个报文
关闭nagle算法试试
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

引用
之后,剩余的内容开始单字节发送,而且很慢,半天才发送处去一个报文
关闭nagle算法试试


TCP_NODELAY可以关闭Nagle算法.

试了,不行,应该不是这个原因。
我的情况是,send了247字节的信息,但是报文实际发送了87字节,
剩下的160字节单字节发送,就是说后续每个报文中只包含一个字节,
这些报文每一个都至少要等待十几秒,而且等待时间会越来越长,
我现在把超时时间设成6秒了,send直接返回SOCKET_ERROR。
有意思的是,前面的行长度也是247字节,send能够正确返回

补充一下,一开始send是可以返回的,返回的是正确的长度,但抓包的结果与上面描述相同,
我以为是缓冲区的问题,就用setsockopt把send的缓冲区关了,send就不再返回了,抓包结果仍然与上面相同
按照网上的说法,是关闭了缓冲区之后send就自己发送数据,由于数据没发送完成,所以send就一直阻塞

send只管把数据交给内核就返回了,之后由内核把数据到链路.
------解决方案--------------------
你没有看看你抓的包里面的窗口大小啊
既然能够send  247,但实际发送87,可能是server端接收的问题