Linux下Tcp 编程

    xiaoxiao2026-09-19  17

    今天要写一个linux下C/S模式程序,然后就遇见一个问题。

    服务器端是被动连接的,然后准备让多个Client端连接,Socket在Client异常中断的情况下。服务器端也会随之中断。

    根据网络搜索的结果,这个一般是由于向一个被破坏的socket连接或者pipe读写数据造成的,说这种场景不会出现SIGPIPE信号,而是直接send, write, sendmsg等返回-1,同时errno会被设置成EPIPE。

    根据测试,向一个被破坏了的socket发送或者接受时。确实会出现SIGPIPE信号,然后程序随之中断。

    所以解决办法就有了:

    1.client中忽略SIGPIPE信号

    signal(SIGPIPE, SIG_IGN);

    然后判断返回值与errno标志确定是否退出或者做其他处理

    2.阻止SIGPIPE信号

    sigset_t set; sigemptyset(&set); sigaddset(&set, SIGPIPE); sigprocmask(SIG_BLOCK, &set, NULL);

    3 为SIGPIPE添加信号处理函数,处理完程序继续执行

    signal(SIGPIPE, pipesig_handler);

    单个线程退出即可。

    转载请注明原文地址: https://ju.6miu.com/read-1312129.html
    最新回复(0)