首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Linux中的套接字发送没有连接的数据时崩溃

问通过Linux中的套接字发送没有连接的数据时崩溃
EN

Stack Overflow用户
提问于 2013-10-04 03:39:39
回答 2查看 5.7K关注 0票数 1

我使用C语言通过Linux中的套接字通过命令发送数据

代码语言:javascript
复制
send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);

程序是:

  1. 创建插座
  2. 连接到服务器
  3. 时间(条件):发送数据

当我在Linux环境下运行这个程序时,如果它是连接的,就没有问题。但是,为了处理运行时失败的连接,我检查了一些案例,得到了如下结果:

案例1:

  1. 创建套接字:没有创建(注释掉创建函数)
  2. 连接到服务器:没有连接(注释掉连接功能)
  3. 发送数据->失败(返回-1),但没有崩溃

案例2:

  1. 创建套接字:成功
  2. 连接到服务器:失败甚至没有连接(注释删除连接功能)
  3. 发送数据->崩溃

然后,我尝试了3种不同的socket 值,而没有连接到服务器。

案例3:

  1. ServerSocket = -1 ->发送数据:失败
  2. ServerSocket =0->发送数据:失败
  3. ServerSocket =4->发送数据:崩溃

如果发送失败,这是正确的,但我不明白为什么我会在其他情况下崩溃。我尝试了Windows,但没有问题,Linux和Windows之间有什么不同吗?说得通吗?我只想打开套接字并连接到服务器一次,然后再发送上千次数据,所以如果在这种情况下“崩溃”是有意义的,那么在连接失败的情况下如何解决这个问题呢?耽误您时间,实在对不起。

下面是案例2(通过停止服务器来测试失败连接的情况,连接失败):

代码语言:javascript
复制
ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP) ;
...
iResult = connect(ServerSocket,(struct sockaddrx *)&server , sizeof(server));
iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
if(iResult<0)
{...}

下面是案例3:

代码语言:javascript
复制
    //ServerSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_IP) ;
    ...
    //iResult = connect(ServerSocket,(struct sockaddrx *)&server , sizeof(server));
    ServerSocket = 0;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    ServerSocket = -1;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    ServerSocket = 4;
    iResult = send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
    log();
    if(iResult<0)
    {...}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 04:17:56

你的程序做的是而不是崩溃!

它接收到一个SIGPIPE信号,因为套接字的本地端已经关闭。读取man 2 send,特别是EPIPE错误案例。(因此,准确地说,您的程序由于一个未处理的SIGPIPE信号而终止。)

正如man 7 signal手册页所述,SIGPIPE的默认配置是终止进程。要避免终止,可以设置SIGPIPE信号处理程序,或者使用send(socket, buffer, length, MSG_NOSIGNAL)。

不要使用Windows作为测量棒。这不是一种理智的方法。您有更好的,实际上是可靠的可用文档。Linux手册项目是C库文档(第3节)的最佳来源之一。尽管它主要关注Linux和GNU C库,但每个页面都有一个符合要求的部分,该节告诉您何时何地可以使用该功能。

上面的链接引用了最新的网页,但是您也可以在命令行上使用man 2 send、man 7 signal来浏览相同的信息。这些网页比发行版更最新,但项目只包含标准手册页,而不是由应用程序或额外库安装的手册页。

有问题吗?

票数 14
EN

Stack Overflow用户

发布于 2013-10-04 03:49:40

案例2.3:这应该失败,我的意思是它应该返回-1附带的值为errno. -你没有说明你的意思‘失败’或‘崩溃’,所以这是不可能作出进一步的评论。

案例3:除非FD 0或4恰好是一个套接字,否则所有这些都会失败。

我不知道你为什么要测试这些。一个‘失败的连接’是一个完全不同的东西,从一个插座从来没有被连接的第一。“失败连接”显示为来自send(), recv(),和朋友的-1返回,伴随的值是errno,而不是EAGAIN/EWOULDBLOCK.,您不能发送到未连接的TCP套接字,而且您的代码甚至不可能尝试它。如果是,则错误处理代码路径是不正确的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19172804

复制
相关文章

相似问题

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