我使用C语言通过Linux中的套接字通过命令发送数据
send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);程序是:
当我在Linux环境下运行这个程序时,如果它是连接的,就没有问题。但是,为了处理运行时失败的连接,我检查了一些案例,得到了如下结果:
案例1:
案例2:
然后,我尝试了3种不同的socket 值,而没有连接到服务器。
案例3:
如果发送失败,这是正确的,但我不明白为什么我会在其他情况下崩溃。我尝试了Windows,但没有问题,Linux和Windows之间有什么不同吗?说得通吗?我只想打开套接字并连接到服务器一次,然后再发送上千次数据,所以如果在这种情况下“崩溃”是有意义的,那么在连接失败的情况下如何解决这个问题呢?耽误您时间,实在对不起。
下面是案例2(通过停止服务器来测试失败连接的情况,连接失败):
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:
//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)
{...}发布于 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来浏览相同的信息。这些网页比发行版更最新,但项目只包含标准手册页,而不是由应用程序或额外库安装的手册页。
有问题吗?
发布于 2013-10-04 03:49:40
案例2.3:这应该失败,我的意思是它应该返回-1附带的值为errno. -你没有说明你的意思‘失败’或‘崩溃’,所以这是不可能作出进一步的评论。
案例3:除非FD 0或4恰好是一个套接字,否则所有这些都会失败。
我不知道你为什么要测试这些。一个‘失败的连接’是一个完全不同的东西,从一个插座从来没有被连接的第一。“失败连接”显示为来自send(), recv(),和朋友的-1返回,伴随的值是errno,而不是EAGAIN/EWOULDBLOCK.,您不能发送到未连接的TCP套接字,而且您的代码甚至不可能尝试它。如果是,则错误处理代码路径是不正确的。
https://stackoverflow.com/questions/19172804
复制相似问题