使用Socket时,客户端用Send方法往服务器发信息,如果服务器还没收到第一条信息,这时客户端又用Send向服务器发送第二条信息,这时双方会不会出错?如果会出错出什么错?

解决方案 »

  1.   

    在使用UDP方式发送时,有可能第二条信息会先到达。
      

  2.   

    Tcp协议保证数据顺序、可靠的到达。
      

  3.   

    可以在udp传输上做检查,间接达到tcp传输的效果
      

  4.   

    就是udp数据的接收验证
    单个udp传输数据验证可以这样做
    在udp数据里做个标记
    A ----> B
    如果B收到返回一个udp数据表示收到
    如果在一定时间内A没有收到,则重新发送
      

  5.   

    不会出错不要老被所谓的阻塞 Socket (其实就是老掉牙的select 模型)所混淆,瞧瞧 Network Programming for Microsoft Windows 2nd 就知道了(用电驴搜),如果嫌太深,就建议楼主用异步多写socket 并且注意你写下的每一个参数,有不少的人学编程是抄抄抄,自己写下的字自己都不知道是什么,然后就是到处问(不是说楼主哩),其它答案都在自己所打的字里。比如注意下Socket 构造:new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
    这三个参数各是什么意思,为什么这么用,就明白为什么不会出错了,特别是第二个参数 SocketType.Stream 当然上面所说的是.net 编程时程序员会在逻辑上的出错可能,因为系统对收发数据都是有缓冲区的,你发了三个过来都在缓冲里呢。(如果用完成端口模型而不用.net 的socket 就可以控制到细节,在.net 被包装了,参见 http://spaces.msn.com/members/arliweng/Blog/cns!1p0Nt-ZM4sbr2MSyXYRugcaw!108.entry )
      

  6.   

    上文说注意瞧 Socket 构造的三个参数并不是答案,而只是一个了解的切入点
    其实呢在socket 发出时,都会等待应答(象阻塞),如果半天了没动静,系统会再启一条线程来负责你新发出的消息,线程的控制在.net 中是线程池不管是发还是收,如果超级多的半天没动静就是所谓的拒绝攻击
      

  7.   

    不会的,TCP有一个顺序的字段。不会混的
      

  8.   

    ArLi2003,你还有这个100分问题没帮我回答完呢,我也准备结贴了
    http://community.csdn.net/Expert/topic/3903/3903709.xml?temp=.2320063