hoa*_*vnu 1 c sockets linux crash
我正在使用C语言通过使用命令在Linux中通过套接字发送数据
send(ServerSocket, cSendBuff, strlen(cSendBuff), 0);
Run Code Online (Sandbox Code Playgroud)
程序是:
- 创建套接字
- 连接到服务器
- while(条件):发送数据
当我在Linux环境中运行该程序时,如果已连接,则没有问题.但是为了在运行时处理失败的连接,我检查一些情况并得到如下结果:
情况1:
- 创建套接字:无创建(注释掉创建功能)
- 连接到服务器:无连接(注释掉连接功能)
- 发送数据 - > 失败(返回-1)但没有崩溃
案例2:
- 创建套接字:成功
- 连接到服务器:失败甚至无连接(注释掉连接功能)
- 发送数据 - > 崩溃
然后,我尝试了3个不同的套接字值,没有连接到服务器
案例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)
{...}
Run Code Online (Sandbox Code Playgroud)
案例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)
{...}
Run Code Online (Sandbox Code Playgroud)
Nom*_*mal 10
程序的确不 崩溃!
它接收到一个SIGPIPE信号,因为套接字的本地端已经关闭.阅读man 2 send,尤其是EPIPE错误案例.(因此,准确地说,由于未处理的SIGPIPE信号,您的程序将被终止.)
正如man 7 signal手册页所述,默认处置SIGPIPE是终止进程.要避免终止,可以设置SIGPIPE信号处理程序,也可以使用send(socket, buffer, length, MSG_NOSIGNAL).
不要使用Windows作为测量棒.这不是一个理智的方法.你有更好的,实际可靠的文档.在Linux手册的页面项目对C库文件(最好来源之一第3节).即使它专注于Linux和GNU C库,每个页面都有一个Conforming to 部分,它告诉你该功能何时何地可用.
上面的链接指上最新的网页,但你也可以使用man 2 send,man 7 signal在命令行上浏览相同的信息.网页比发行版更新,但项目只包括标准手册页,而不是应用程序安装的那些页面或您可能拥有的额外库.
有问题吗?
| 归档时间: |
|
| 查看次数: |
4277 次 |
| 最近记录: |