我正在使用C语言通过命令
在Linux中通过套接字发送数据send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
程序是:
- 创建套接字
- 连接到服务器
- while(条件):发送数据
醇>
当我在Linux环境中运行该程序时,如果已连接,则没有问题。但是为了在运行时处理失败的连接,我检查一些情况并得到如下结果:
案例1:
- 创建套接字:无创建(注释掉创建功能)
- 与服务器的连接:无连接(注释掉连接功能)
- 发送数据 - > 失败(返回-1),但没有崩溃
醇>
案例2:
- 创建套接字:成功
- 与服务器的连接:失败甚至无连接(注释掉 连接功能)
- 发送数据 - >的崩溃
醇>
然后,我尝试了3个不同的socket WITHOUT 连接到服务器
的值案例3:
- ServerSocket = -1 - >发送数据:失败
- ServerSocket = 0 - >发送数据:失败
- ServerSocket = 4 - >发送数据:崩溃
醇>
如果发送失败,这是正确的,但我不明白为什么我在其他情况下崩溃。我试过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)
{...}
答案 0 :(得分:10)
您的程序不 崩溃!
它收到SIGPIPE
信号,因为套接字的本地端已关闭。阅读man 2 send
,尤其是EPIPE
错误案例。 (因此,准确地说,由于未处理的SIGPIPE
信号,您的程序将被终止。)
正如man 7 signal
手册页所述,SIGPIPE
的默认处置是终止进程。要避免终止,请设置SIGPIPE
信号处理程序,或使用send(socket, buffer, length, MSG_NOSIGNAL)
。
请勿使用Windows作为测量棒。这不是一个理智的方法。你有更好的,实际可靠的文档。 Linux man-pages项目是C库文档(section 3)的最佳来源之一。即使它专注于Linux和GNU C库,每个页面都有一个符合部分,它告诉你该功能何时何地可用。
以上链接指的是最新的网页,但您也可以在命令行上使用man 2 send
,man 7 signal
来浏览相同的信息。网页比发行版更新,但项目只包括标准手册页,而不是应用程序或您可能拥有的额外库所安装的页面。
有问题吗?
答案 1 :(得分:0)
案例2.3:这应该失败,我的意思是它应该返回-1,伴随值为errno.
你没有说明你的意思是'失败'或'崩溃,'因此无法进一步评论。
案例3: 除非FD 0或4碰巧是套接字,否则这些都应该同样失败。
我不知道你为什么要测试这些。 “失败的连接”与首先从未连接的套接字完全不同。 “失败的连接”表现为来自send(), recv(),
和朋友的-1返回,伴随值errno
而不是EAGAIN/EWOULDBLOCK.
您无法发送到不存在的TCP套接字连接,您的代码甚至不应该尝试它。如果是,则您的错误处理代码路径不正确。