这个问题产生于编程中遇到的几个问题:
1、使用TCP的Socket发送数据的时候,会出现发送出错,WSAEWOULDBLOCK,在TCP中不是会保证发送的数据能够安全的到达接收端的吗?也有窗口机制去防止发送速度过快,为什么还会出错呢?2、TCP协议,在使用Socket发送数据的时候,每次发送一个包,接收端是完整的接受到一个包还是怎么样?如果是每发一个包,就接受一个包,为什么还会出现粘包问题,具体是怎么运行的?3、关于Send,是不是只有在非阻塞状态下才会出现实际发送的比指定发送的小?在阻塞状态下会不会出现实际发送的比指定发送的小,就是说只能出现要么全发送,要么不发送?在非阻塞状态下,如果之发送了一些数据,要怎么处理,调用了Send函数后,发现返回值比指定的要小,具体要怎么做?4、最后一个问题,就是TCP/IP协议和Socket是什么关系?是指具体的实现上,Socket是TCP/IP的实现?那么为什么会出现使用TCP协议的Socket会发送出错(又回到第一个问题了,汗一个)实在是有点晕了,如果我的问题有不清楚的地方,或者分数有问题,欢迎指出,谢谢

解决方案 »

  1.   

    1 应该是你的缓冲区不够大,
    2 tcp是流,没有界限.也就所所谓的包.
    3 阻塞也会出现这种现象,出现后继续发送没发送出去的.
    4 tcp是协议,socket是一种接口,没必然联系.错误取决于你使用接口的问题,跟tcp没关系.
      

  2.   

    1 应该是你的缓冲区不够大, 
    2 tcp是流,没有界限.也就无所谓包. 
    3 阻塞也会出现这种现象,出现后继续发送没发送出去的. 
    4 tcp是协议,socket是一种接口,没必然联系.错误取决于你使用接口的问题,跟tcp没关系.
      

  3.   

    1、应该不是缓冲区大小问题,我试过设置缓冲区大小,不过这里有个问题,就是就算我把缓冲区设置成几G,也返回成功,不过实际上怎么可能设置那么大、、、3、出现没发送完的时候要手动发送吧,有没有具体的代码实现?4、当选择TCP的Socket发送数据的时候,TCP中的窗口机制不是能防止发送速度过快的吗?为什么Socket在出现了WSAEWOULDBLOCK后没有处理?
      

  4.   

    1、使用非阻塞模式时,如果当前操作不能立即完成则会返回失败,错误码是WSAEWOULDBLOCK,这是正常的,程序可以先执行其它任务,过一段时间后再重试该操作。
    2、发送与接收不是一一对应的,TCP会把各次发送的数据重新组合,可能合并也可能拆分,但发送次序是不变的。
    3、在各种情况下都要根据send的返回值来确定发送了多少数据,没有发送完就再接着发。
    4、socket是Windows提供网络编程接口,TCP/IP是网络传输协议,使用socket是可以使用多种协议,其中包括TCP/IP。
      

  5.   

    发送的过程是:发送到缓冲区和从缓冲区发送到网络上
    WSAEWOULDBLOCK和粘包都是出现在发送到缓冲区这个过程的