用delphi使用套接字发现的问题,我想问的是UDP协议套接字接受数据用recvfrom,我一直以为是调用recvfrom时线程(非异步套接字)是一直等待,直到有人发送数据,才返回,并接受在recfrom后加了其他
语句确实发现是这样的,未接受数据线程就停在了recvfrom处
    不过我让另一端先发送,而接受端后调用recvfrom也一样可以接受到数据,显然问题来了,一端发送数据时,对方即使过一会再接数据也一样能接到,不需要在发送端发送前就调用recvfrom和我当初看到的一个说法不一样,那我猜测数据可能先发送到了端口,然后调用recvfrom就可以取到,如果端口啥也没有recvfrom就等待。
      但又有一个问题出现,我尝试了一下,如果接收方不调用recvfrom,由发送方发送3次不同的数据接收方再调用3次recvfrom居然可以接受到3个数据,第四次接受不到,但这3次确实相同的数据,都是最后一次发送的那个数据,只有又试了4次,发送5次发送,接受也分别可以接受到4次数据和5次数据,但还都是相同的数据这个是啥子原理啊,UDP接受和发送数据到底是怎么完成的,哪位高手解释下。。

解决方案 »

  1.   

    使用的是哪套socket控件?
    自带的、indy、...?
      

  2.   

    recvfrom 只是从Socket缓冲区取数据,有就返回,无就等待,
    接受数据,建议请先初始化你的接受buf。
    估计你已经做好了。
      

  3.   

    数据先被内核接收到内核缓冲区,recvfrom是从内核缓存区copy到你的自己的缓冲区中,如果你提供的接收缓冲区长度比内核缓冲区中接收到的长度小,那么你只能接收到一部分的数据,其余的数据将丢失,wsagetlasterror返回WSAEMSGSIZE 10040你的问题可能是思路上的问题:并不是发送一次对应接收一次。不是这样理解的。
      

  4.   

    而且UDP不保证数据的可靠性:也就是不保证按顺序到达,不保证不会丢失部分数据