UDP socket接收数据相关问题求教。。。

summergo 2013-02-08 08:56:12
用delphi使用套接字发现的问题,我想问的是UDP协议套接字接受数据用recvfrom,我一直以为是调用recvfrom时线程(非异步套接字)是一直等待,直到有人发送数据,才返回,并接受。。。在recfrom后加了其他
语句确实发现是这样的,未接受数据线程就停在了recvfrom处。。。
不过我让另一端先发送,而接受端后调用recvfrom也一样可以接受到数据,显然问题来了,一端发送数据时,对方即使过一会再接数据也一样能接到,不需要在发送端发送前就调用recvfrom。。。和我当初看到的一个说法不一样,那我猜测数据可能先发送到了端口,然后调用recvfrom就可以取到,如果端口啥也没有recvfrom就等待。
但又有一个问题出现,我尝试了一下,如果接收方不调用recvfrom,由发送方发送3次不同的数据。。。接收方再调用3次recvfrom居然可以接受到3个数据,第四次接受不到,但这3次确实相同的数据,都是最后一次发送的那个数据,只有又试了4次,发送5次发送,接受也分别可以接受到4次数据和5次数据,但还都是相同的数据。。。这个是啥子原理啊,UDP接受和发送数据到底是怎么完成的,哪位高手解释下。。。。。
...全文
268 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-04-08
  • 打赏
  • 举报
回复
而且UDP不保证数据的可靠性:也就是不保证按顺序到达,不保证不会丢失部分数据
「已注销」 2013-04-08
  • 打赏
  • 举报
回复
数据先被内核接收到内核缓冲区,recvfrom是从内核缓存区copy到你的自己的缓冲区中,如果你提供的接收缓冲区长度比内核缓冲区中接收到的长度小,那么你只能接收到一部分的数据,其余的数据将丢失,wsagetlasterror返回WSAEMSGSIZE 10040 你的问题可能是思路上的问题:并不是发送一次对应接收一次。不是这样理解的。
taninsh 2013-04-07
  • 打赏
  • 举报
回复
recvfrom 只是从Socket缓冲区取数据,有就返回,无就等待, 接受数据,建议请先初始化你的接受buf。 估计你已经做好了。
haitao 2013-02-10
  • 打赏
  • 举报
回复
使用的是哪套socket控件? 自带的、indy、...?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧