首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查连接打开还是关闭?(在Linux中使用C语言)

检查连接打开还是关闭?(在Linux中使用C语言)
EN

Stack Overflow用户
提问于 2009-11-25 07:20:30
回答 3查看 71K关注 0票数 12

在Linux中的套接字编程中,我需要用socket编写数据,但我不知道套接字是打开的还是关闭的。我怎么知道套接字是打开和关闭的,没有读?

代码语言:javascript
复制
printf("befor read%d\n", n);
bzero(buffer, MAX_SIZE_BUFFER);
n = read(sockfd, buffer, MAX_SIZE_BUFFER - 1);
printf("after read%d\n", n);
if (n <= 0)
{
    break;
}
printf("befor write%d, s: %d \n", n , sockfd);

n = write(newsockfd, buffer, n);
if (n <= 0)
{
    break;
}

我从sockfd上读到,我确信这个连接是打开的。当在newsockfd中写入缓冲区时,我不知道newsockfd是打开的还是关闭的,如何检查newsockfd是否已关闭?

我知道问题所在。在写作过程中,连接关闭。例如,在500个连接关闭和程序关闭时写入1024个数据。如何避免这种情况?

EN

Stack Overflow用户

发布于 2009-11-25 07:25:20

令人惊讶的是,检查是否可以写入套接字的方法是尝试写到它:-)

如果套接字已经关闭,您将从write获得一个write返回代码,您可以检查errno以查看问题所在。

如果套接字仍然有效,但目前无法写入任何数据,write将返回0。read调用也以类似的方式运行,如果出现问题,则返回-1

基本上,对于write

  • 如果你拿回了一个-1,你应该检查它是可恢复的还是致命的。如果你拿回一个0,那么你现在什么都不能写(可能是网络积压或者其他问题,但肯定不是致命的)。如果你得到的值低于你想要的值,那么就发送了一些数据。调整您的指针,以便您可以尝试发送其余在下一个周期。不要假设返回值为正,这意味着整个块已经发送。
  • 如果您返回的字节数与您试图发送的字节数相同,则整个缓冲区已被接受传递。如果您返回的内容超过了所要求发送的内容,则向内核开发人员发送一封电子邮件,并附上一些尖锐的注释。莱纳斯等人会喜欢这样的:-)

更新:正如caf在评论中指出的,我忘了考虑信号处理。您必须忽略已损坏的管道信号,否则write将通过发出该信号而在内部失效。

您可以通过插入:

代码语言:javascript
复制
struct sigaction new_actn, old_actn;
new_actn.sa_handler = SIG_IGN;
sigemptyset (&new_actn.sa_mask);
new_actn.sa_flags = 0;
sigaction (SIGPIPE, &new_actn, &old_actn);

在开始使用套接字函数之前。然后,您可以使用:

代码语言:javascript
复制
sigaction (SIGPIPE, &old_actn, NULL);

若要恢复先前的信号处理,请执行以下操作。

票数 22
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1795193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档