UDP 网络在系统 waiting/receiving 数据时卡住
UDP network stuck while system waiting/receiving data
我要搭建一个双向的UDP网络系统,即服务器端和客户端都发送和接收数据,如下图所示:
我从
http://www.binarytides.com/udp-socket-programming-in-winsock/
但是,在客户端上,当发送数据(字符串)时,客户端卡在等待此行上的传入数据:
recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)
客户端在收到传入数据之前无法发送更多数据。
有什么方法可以让我在等待传入数据的同时不断向服务器发送数据?
这是因为默认情况下套接字是阻塞的,这意味着 recv
和 read
家庭呼叫将挂起,直到有数据可用。您需要使用非阻塞 I/O 和 select()
或 poll()
等多路复用,或者使用单独的专用线程来接收数据。
非阻塞 I/O 在设计上与阻塞 I/O 代码有很大不同,因此您无法进行简单的更改。我建议您阅读涵盖所有这些问题的类似 Beej's Guide to Network Programming 的内容。
我要搭建一个双向的UDP网络系统,即服务器端和客户端都发送和接收数据,如下图所示:
我从 http://www.binarytides.com/udp-socket-programming-in-winsock/
但是,在客户端上,当发送数据(字符串)时,客户端卡在等待此行上的传入数据:
recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)
客户端在收到传入数据之前无法发送更多数据。
有什么方法可以让我在等待传入数据的同时不断向服务器发送数据?
这是因为默认情况下套接字是阻塞的,这意味着 recv
和 read
家庭呼叫将挂起,直到有数据可用。您需要使用非阻塞 I/O 和 select()
或 poll()
等多路复用,或者使用单独的专用线程来接收数据。
非阻塞 I/O 在设计上与阻塞 I/O 代码有很大不同,因此您无法进行简单的更改。我建议您阅读涵盖所有这些问题的类似 Beej's Guide to Network Programming 的内容。