UDP网络在等待/接收数据时出现了卡顿问题。

5

我需要建立一个双向UDP网络系统,即服务器和客户端都可以发送和接收数据,如下图所示:

network diagram

我从http://www.binarytides.com/udp-socket-programming-in-winsock/获取了一个现成的例子。

然而,在客户端,当发送数据(字符串)时,客户端在以下代码行上等待接收数据:

recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)

客户端在接收到数据之前不能发送更多的数据。

是否有一种方法可以在等待接收数据的同时继续向服务器发送数据?

1个回答

4
这是因为默认情况下套接字是阻塞的,这意味着recvread 系列调用将会一直等待,直到有可用数据。你需要使用非阻塞 I/O 与多路复用,例如select() 或者 poll(),或者使用一个专门的线程来接收数据。
非阻塞 I/O 在设计上与阻塞 I/O 的代码有很大的区别,所以没有简单的修改方法。我建议你阅读像Beej's Guide to Network Programming 这样覆盖所有这些问题的文献。

非常感谢。这真的帮了我很多。这是否意味着在UDP结构下也可以构建非阻塞I/O?我很感激。 - Shin Chen Hu
@ShinChenHu 是的,非阻塞I/O可以使用任何类型的套接字,包括UDP或TCP。在您的操作系统中查找“C语言非阻塞UDP服务器”的示例。我提供的Beej's指南中有一个Linux示例,并附有使程序在Windows上运行的说明。 - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接