Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 如何停止read()函数?_Sockets_Udp - Fatal编程技术网

Sockets 如何停止read()函数?

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(

我正在linux上用C编写UDP客户机/服务器程序。问题是,我必须添加连接检查功能。在linux手册页中,我找到了具有此功能的udp客户端示例()。它使用写/读函数检查服务器响应。我尝试将其应用到我的程序中,结果如下:

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