none
[SOCKET多线程问题]windows XP 多线程对同一个socket描述符使用send是安全的么? RRS feed

  • 问题

  • 查遍了msdn都没有这方面的说明,网络上面也没有明确的说明是否安全的!
    我自己写了测试程序,3线程同时send,目前为止测试还是正确的!但是不知道底层内容,所以还是不能确定。
    请问,多线程对同一个socket描述符使用send是安全的么?
    发送端会出现使程序崩溃的情况么?
    客户端接收会出现内容乱序情况么?

    2009年10月6日 12:23

答案

全部回复

  • 只有一个线程在工作,除非多对多。所以是安全的。
    2009年10月6日 13:46
  • Send的话应该是TCP协议吧.底层是单线程的.TCP接受肯定按是先后顺序的


    0xBAADF00D
    • 已标记为答案 SuperKuku 2009年10月16日 0:35
    2009年10月7日 2:29
    版主
  • 查遍了msdn都没有这方面的说明,网络上面也没有明确的说明是否安全的!
    我自己写了测试程序,3线程同时send,目前为止测试还是正确的!但是不知道底层内容,所以还是不能确定。
    请问,多线程对同一个socket描述符使用send是安全的么?
    发送端会出现使程序崩溃的情况么?
    客户端接收会出现内容乱序情况么?


    朋友,您好

    send函数

    int send( SOCKET s,    const char FAR *buf,    int len,    int flags );  

    不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。

    客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。

    该函数的第一个参数指定发送端套接字描述符;

    第二个参数指明一个存放应用程序要发送数据的缓冲区;

    第三个参数指明实际要发送的数据的字节数;

    第四个参数一般置0。

    这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的发送缓冲区的长度,该函数返回SOCKET_ERROR;如果len小于或者等于s的发送缓冲区的长度,那么send先检查协议 是否正在发送s的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送s的发送缓冲中的数据或者s的发送缓冲中没有数据,那么 send就比较s的发送缓冲区的剩余空间和len,如果len大于剩余空间大小send就一直等待协议把s的发送缓冲中的数据发送完,如果len小于剩余 空间大小send就仅仅把buf中的数据copy到剩余空间里(注意并不是send把s的发送缓冲中的数据传到连接的另一端的,而是协议传的,send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里)。如果send函数copy数据成功,就返回实际copy的字节数,如果send在copy数据时出现错误,那么send就返回SOCKET_ERROR;如果send在等待协议传送数据时网络断开的话,那么send函数也返回SOCKET_ERROR。

    要注意send函数把buf中的数据成功copy到s的发送缓冲的剩余空间里后它就返回了,但是此时这些数据并不一定马上被传到连接的另一端如 果协议在后续的传送过程中出现网络错误的话,那么下一个Socket函数就会返回SOCKET_ERROR。(每一个除send外的Socket函数在执 行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,如果在等待时出现网络错误,那么该Socket函数就返回 SOCKET_ERROR)


    Smile service,common progress!
    2009年10月8日 17:01
  • 谢谢,send确实不会把内容直接传到对方。但是send会把数据copy到发送缓冲区!但是问题在于写入发送缓冲区的时候,copy操作并不是原子的,所以多线程同时写入会导致写入顺序交叉么?
    如果写入顺序交叉的话就可能造成发送缓冲区中的数据乱序的问题。

    2009年10月15日 0:36
  • 对每个send操作加锁
    麻烦把正确答案设为解答。
    • 已标记为答案 SuperKuku 2009年10月16日 0:35
    2009年10月15日 0:40
    版主