如何停止对套接字的读操作?

时间:2009-02-20 18:49:19

标签: c networking

我从一个帖子得到以下代码:

int next_stuff(char **code){
    ...       
    len=read(file_desc,buffer+end_len,packet_size-end_len);
    if(len<=0)
    {
        if(len==-1 && errno==EAGAIN) return(0);
        else return(-1);
    }
    ...
}

while (next_stuff(&buff) == 0)
{
    ...
}

在另一个线程上,我想完成该套接字并退出此操作,但只执行

close(file_desc);

不会导致读取返回非阻塞。我错过了什么吗?

编辑:

关机也不起作用。我正在Linux 2.6.23上尝试

5 个答案:

答案 0 :(得分:2)

shutdown(fd,SHUT_RD);

$ man -s 2 shutdown

NAME      shutdown - 关闭部分全双工连接

概要

 #include <sys/socket.h>

 int     shutdown(int socket, int how);

说明

 The shutdown() call causes all or part of a full-duplex connection on the socket 
 associated with socket to be shut down.  
 If how is SHUT_RD, further receives will be disallowed.  If how is 
 SHUT_WR, further sends will be
 disallowed.  If how is SHUT_RDWR, further sends and receives will be disallowed.

返回值

 The shutdown() function returns the value 0 if successful; otherwise the value -1 is 
 returned and the global variable errno is set to indicate the error.

答案 1 :(得分:1)

通常,如果您不想阻止套接字调用,则可以使用select()来查看套接字是否已准备好进行读取,写入或处于错误状态。此外,将超时值传递给select(),以便此调用不会永久阻塞。在select()调用返回后,您可以查看应用程序是否要退出,如果是,则执行“正确”操作(由您决定)。

答案 2 :(得分:0)

如果你的read()调用是非阻塞的,它应该返回相当快,因为​​它将要做的就是插入内存。 为了防止造成任何损害,你可以在你的调用中使用一个互斥量来读取()和关闭(),这样它们就不能同时运行。

如果您的套接字阻塞,我认为您应该将其设置为非阻塞。

答案 3 :(得分:0)

关于非阻塞套接字的其他答案都很好,我建议重新编码以使用该方法。

作为对你的问题的直接回答,尝试调用shutdown()并查看是否会破坏其他线程的读取。我担心close()只是递减使用次数,而shutdown()会主动拆掉套接字。

答案 4 :(得分:0)

我认为你没有提供足够的信息来回答这个问题。例如,如果您打开的套接字是UDP,则发送方的关闭对接收方没有影响。如果它是TCP,则会破坏其他内容。我建议如果您真的处理套接字,请使用recvrecvfrom代替read

对于TCP,您的读取将返回0个字节,表示另一方已关闭连接。

如果你真的是在两个线程而不是两个进程之间进行此操作,那么管道可能更合适。这并不是说管道也不能在两个独立的进程之间使用,在这种情况下只需要设置一些。