Sockets 如何停止read()函数?
我正在linux上用C编写UDP客户机/服务器程序。问题是,我必须添加连接检查功能。在linux手册页中,我找到了具有此功能的udp客户端示例()。它使用写/读函数检查服务器响应。我尝试将其应用到我的程序中,结果如下:Sockets 如何停止read()函数?,sockets,udp,Sockets,Udp,我正在linux上用C编写UDP客户机/服务器程序。问题是,我必须添加连接检查功能。在linux手册页中,我找到了具有此功能的udp客户端示例()。它使用写/读函数检查服务器响应。我尝试将其应用到我的程序中,结果如下: char *test = "test"; nlen = strlen(test) + 1; if (write(sock, test, nlen) != nlen) { // socket with the connection fprintf(
char *test = "test";
nlen = strlen(test) + 1;
if (write(sock, test, nlen) != nlen) { // socket with the connection
fprintf(stderr, "partial/failed write\n");
exit(EXIT_FAILURE);
}
nread = read(sock, buf, nlen);
if (nread == -1) {
perror("Connection");
exit(EXIT_FAILURE);
}
问题是,当服务器打开时,我用这个位执行程序,它除了读取输入无限时间外什么也不做,而它也不使用。我尝试了kill(getpid(),SIGHUP)中断(我在这里找到了其他类似的主题)和shutdown(sock,1),但似乎没有任何效果。您能告诉我一种方法,如何停止输入读取或任何其他可能的选项来检查udp服务器是否处于活动状态吗?您应该使用异步读取 为此,必须使用“sys/socket.h”中的select()函数 该函数在不阻塞的情况下监视套接字描述符的更改 您可以找到它的引用,或者在控制台中键入“man select”
Windows有一个例子,但它的用法与UNIX非常相似。很好的建议,虽然这不是“异步读取”,但它是同步多路复用读取。您可能在这里指的是使用超时,因为
select(2)
也会阻止等待IO事件,所以现在您遇到了中断的问题。是的,请使用“select”我不确定我是否做对了,但我认为它不适用于dgram套接字。当我在客户端描述套接字writefds时,无论服务器是开还是关,都选择return1