使用 UDP 联网
使用 sendto() 将 UDP 数据包发送到主机时会发生什么。 我发送的所有位都已发送(从返回值可知)。我立即使用recvfrom(),它不输出任何内容,但程序不退出(即没有返回值)。
我认为如果没有收到回复,程序必须退出。
来自端口的 UDP 数据包的回复是什么。
这个数据包被防火墙阻止了吗?如果是的话为什么sendto的返回值是非负的。
what happens when a UDP packet is sent to a host using sendto().
all the bits i am sending are sent(known from the return value).immediately i use a recvfrom() which does not output anything but program do not exit(i.e no return value).
I think that the program must exit if no reply is recieved.
what will the replies for a UDP packet from a port.
is this packet blocked by firewall?? if yes then why is the return value of sendto is non-negative.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
recvfrom()
将阻塞,直到收到消息为止,除非将套接字设置为非阻塞。您要查找的接口是
ioctl()
和FIONBIO
或O_NONBLOCK
(取决于您的平台)、select() 等待数据到达,或者一段时间后超时
另请记住,
sendto()
的地址和端口号通常是网络字节顺序,因此请查看ntohl
和ntohs
。recvfrom()
will block until a message is received unless you set the socket to non-blocking.The interfaces you want to look for are
ioctl()
withFIONBIO
orO_NONBLOCK
(depending your platform),select()
to wait for data to arrive, or timeout after a whileAlso remember that the address and port number for
sendto()
usually be network-byte order, so look intontohl
andntohs
.您的客户端或服务器一定有错误。首先尝试本地主机,这样你就可以避免防火墙问题
这是我用于测试的非阻塞udp客户端/服务器的示例,它使用ioctl()来检查套接字上是否有数据要读取,但是如果你想做一些使用 epoll 的严肃应用程序会更有效,您也可以指定以微秒为单位等待的超时:
sendto() 是非负数,因为它返回发送的字节数。检查 sendto 的手册页
you must have some error in your client or server. try localhost first, so you avoid firewall problems
this is an example of nonblocking udp client/server I was using for my tests, it uses ioctl() to check if there is data to read on the socket, however if you want to do some serious application using epoll would be more efficient also you can specify timeout to wait in microseconds:
the sendto() is non negative because it returns number of bytes sent. check the man page for sendto