2009-12-29 80 views
2

我在C.闭非阻塞插座

void setNonBlocking(SOCKET fd){ 
    int flags; 
    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) 
     flags = 0; 

    fcntl(fd, F_SETFL, flags | O_NONBLOCK); 
} 

int main(){ 

int sock; 
connect(sock, .....); 
setNonBlocking(sock); 
.... 
close(sock); 

//we will do something here but the application exits in/after the close operation 

} 

以下代码我使用的插座在非阻塞模式与setNonBlocking功能。当我关闭套接字时,应用程序立即退出,没有段错误或其他任何事情。我没有看到这个问题,如果我不使用setNonBlocking函数。

如何在没有此问题的情况下关闭无阻塞套接字?

+2

在GDB下运行你的代码。您描述的行为(关闭导致应用程序退出而不崩溃)几乎是不可能的。 – diciu 2009-12-29 10:08:17

+0

您是否使用'socket()'函数创建了套接字?你的代码中缺少这个。你声明袜子(此时包含垃圾或0),然后你调用connect。 – Frunsi 2009-12-29 12:07:09

+0

你能解释一下你如何在代码中发送/接收数据吗?这可能会更有帮助。通常关闭不应该因为套接字是非阻塞而不同。 – Jay 2009-12-29 18:21:26

回答

1

也许你的应用程序正在获取SIGPIPE。用套接字编程时,通常应该处理或忽略SIGPIPE信号。

0

您忽略fcntl的任何错误结果。如果fcntl返回-1,则应至少打印出错误消息(例如,使用perror)。