我在Linux机器上有一个服务器/客户端应用程序.如果客户端尝试发送请求时服务器未启动,则会收到SIGPIPE并终止应用程序.
在尝试编写之前,如何检查套接字上的服务器是否可用?
另外值得注意的是,我不想捕获SIGPIPE,因为客户端实际上是许多应用程序使用的共享对象的一部分,这些应用程序可能已经或可能没有定义自己的信号处理方法.
谢谢
我试图忽略我在 Swift 应用程序中使用的第三方 SDK 抛出的 SIGPIPE 信号。如何让我的应用程序全局忽略 SIGPIPE 信号?
我正在为 Linux 上的 TCP 连接编写 C++ SSL 服务器。当程序用于SSL_write()写入关闭的管道时,会抛出 SIGPIPE-Exception,从而导致程序关闭。我知道这是正常行为。但是当对等方没有正确关闭连接时,程序不应该总是死掉。
我已经在谷歌上搜索了很多,并尝试了几乎所有我发现的东西,但似乎没有什么对我有用。signal(SIGPIPE,SIG_IGN)不起作用 - 仍然会抛出异常(对于signal(SIGPIPE, SomeKindOfHandler).
gdb 输出:
Program received signal SIGPIPE, Broken pipe.
0x00007ffff6b23ccd in write () from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) where
#0 0x00007ffff6b23ccd in write () from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007ffff7883835 in ?? () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#2 0x00007ffff7881687 in BIO_write () from /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
#3 0x00007ffff7b9d3e0 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#4 0x00007ffff7b9db04 in ?? () from /lib/x86_64-linux-gnu/libssl.so.1.0.0
#5 0x000000000042266a in NetInterface::SendToSubscribers(bool) () at ../Bether/NetInterface.h:181
#6 0x0000000000425834 in …Run Code Online (Sandbox Code Playgroud) 使用system call命令从C++执行bash脚本时遇到问题.该脚本捕获一个SIGPIPE信号并退出返回代码141.
此问题已开始出现在我的代码的最后一个版本中.
我的问题如下:
我正在设计和测试基于TCP套接字(Internet域)的客户端服务器程序.目前,我正在我的本地机器上测试它,并且无法理解以下有关SIGPIPE的信息.
*.SIGPIPE似乎很随机.它可以是确定性的吗?
第一个测试涉及来自客户端的单个小(25个字符)发送操作以及服务器上的相应接收.同一台机器上的相同代码是否成功运行(SIGPIPE)完全不受我的控制.失败率约为45%(非常高).那么,我可以以任何方式调整机器以最小化这个.
**.第二轮测试是从客户端向服务器发送40000个小(25个字符)消息(总数据为1MB),然后服务器响应它实际收到的数据总大小.客户端以紧密循环方式发送数据,并且在服务器上有一个SINGLE接收呼叫.它仅适用于发送的总数据的最大1200字节,并且再次存在这些非确定性的SIGPIPE,现在约为70%(非常糟糕).
有人可以建议我的设计有一些改进(可能会在服务器上).要求是在与服务器建立单个套接字连接之后,客户端应能够通过中等到非常高的数据量发送(每个消息再次大约25个字符).我有一种感觉,针对单个接收的多次发送将总是有损且非常低效.我们应该组合消息并仅在一个send()操作中发送.那是唯一的出路吗?
我编写通过Linux TCP套接字进行通信的网络应用程序.最近我注意到发送系统调用崩溃我的应用程序.当两个对手都启动时,它工作正常(我现在正在测试崩溃恢复).但是当一个对等体出现故障时,第二次崩溃会执行这段代码.
fprintf(stderr, "out_tcp %d\n", out_tcp);
if(send(out_tcp, &packet, sizeof(packet), 0) == -1)
fprintf(stderr, "send TCP error");
fprintf(stderr, "after send");
Run Code Online (Sandbox Code Playgroud)
Socket已准备好并已连接,并且在第二个对等体出现故障之前已执行多次.我希望这段代码返回-1值,但它只在输出上产生"out_tcp 11"然后应用程序退出.没有错误消息,没有发送的返回值.我在Valgrind下运行它,它说应用程序正常退出 - 没有错误/警告消息.
有谁知道如何调试它?使用工具?因为我没有信息,所以我非常坚持这一点.
在此先感谢哈嫩
我尝试用c语言开发一个聊天应用程序。我使用套接字和select(). 但是如果我在客户端之前关闭服务器,客户端会收到一条消息“Broken Pipe”。我使用了 select(),但我不知道如何避免它?
我有一个用C编写的多线程SSL服务器,其行为如下:
epoll),接受它们并为每个客户端套接字生成一个分离的线程SSL_accept分开执行.成功进行SSL握手后,线程会从客户端接收消息并回复每条消息SSL_read.我尝试模拟并发客户端连接来测试服务器.
在一次这样的模拟中,我的服务器退出了SIGPIPE信号.
有没有办法SIGPIPE在线程级别捕获和处理?我希望相应的线程处理信号而不是整个进程退出.
最初我尝试过signal(SIGPIPE,SIG_IGN),但是信号(2)男人说:
signal()在多线程进程中的影响未指定.
可以signalfd被用来处理这些SIGPIPEs?还是有其他解决方案吗?
注意:服务器在Ubuntu 12.04上运行,我不能使用MSG_NOSIGNAL,send因为我直接使用OpenSSL作为库(没有源代码)
提前致谢.
当我使用网络浏览器测试我的程序时,我可以写入套接字/ FD就好了,所以我决定循环它并切断连接中间连接,我注意到了一个问题.当套接字不可用时,send()能够关闭整个程序.我认为问题在于该程序陷入了陷阱22并自行关闭.所以我设置套接字不阻止.没变.有关为什么会发生这种情况的任何想法?
else if ( b->temp_socket_list[read].revents & POLLOUT ) {
printf ( "#Write#\n" );
char *done = "Done!";
int sent = send ( sock, done, 5, 0 );
printf ( "end\n", sent );
}
Run Code Online (Sandbox Code Playgroud) 考虑到在Linux上是C语言的新手,我已经走过了套接字编程场景,你必须处理SIGPIPE问题,并且我遇到了令人烦恼的情况:
1-抓住进程的sigaction然后继续,这等于忽略信号.
struct sigaction sginal_action;
memset(&sginal_action, 0, sizeof (sginal_action));
sginal_action.sa_handler = SIG_IGN;
sginal_action.sa_flags = SA_RESTART;
if (sigaction(SIGPIPE, &sginal_action, null)) {
perror("signal action error");
}
Run Code Online (Sandbox Code Playgroud)
2-忽略线程上的信号使用
sigset_t sigpipe_mask;
sigemptyset(&sigpipe_mask);
sigaddset(&sigpipe_mask, SIGPIPE);
sigset_t saved_mask;
if (pthread_sigmask(SA_RESTART, &sigpipe_mask, &saved_mask) == -1) {
perror("pthread_sigmask");
}
Run Code Online (Sandbox Code Playgroud)
- 现在每件事情都能正常工作但是我需要一个关于这个测试用例行为的答案:
1-服务器接受来自用户A的套接字带文件discriptor int 7
2-我运行冗长的SQL语句,需要25个secondes
3-在第二个20个客户端关闭套接字
4-秒21 Linux内核发送SIGPIPE
5-第二个22进程忽略了SIGPIPE并继续使用文件描述符7,因为没有信号出现任何问题
6-在第二个23服务器接受来自用户B的套接字带文件discriptor int 7再一次!
7-用户B的授权需要2秒应在用户A的第二25完成
8- 核心问题开始在第二25写入(file_dsciptor,缓冲液,BUFFER_SIZE); 来自两个线程的数据都会将数据写入用户A和用户B通道
9-如果用户B没有被授权登录到服务器但是在服务器关闭文件描述符7在线程B之前,客户端A的线程A写入文件描述符7并且由于套接字文件描述符7的重用,客户端B收到了重要数据!
我的问题
是,这种情况是错误的,永远不会发生?
或者有可能发生但是有正确的方法可以应用吗?
是否有一个C系统调用函数来停止通过套接字连接重新使用file_discriptor?
或者应该做些什么来确保打开的频道不与另一个频道冲突,比如我猜的唯一文件描述符?