在linux下为了避免网络出错引起程序退出,我们一般采用MSG_NOSIGNAL来避免系统发送singal。这种错误一般发送在网络断开,但是程序仍然发送数据时,在接收时,没有必要使用。但是在linux下,使用此参数,也不会引起不好的结果,下面是我常用的代码:

    isent = send(socket_fd, szRecvbuff, irecv, MSG_DONTWAIT|
    #if (defined(__APPLE__) && defined(__MACH__))
                                 SO_NOSIGPIPE
    #else
                                 MSG_NOSIGNAL
    #endif
    );
    //recv同

Mac OSX,底层融合了FreeBSD,兼容大部分的POSIX函数,绝大多数的Linux代码可以很少的修改即可使用,在我写的一个TCP测试server中,也是用了上述的代码:

    irecv = recv(socket_fd, szRecvbuff, sizeof(szRecvbuff), MSG_DONTWAIT|
    #if (defined(__APPLE__) && defined(__MACH__))
                                 SO_NOSIGPIPE
    #else
                                 MSG_NOSIGNAL
    #endif
    );

程序表现出来的症状是:
1)recv循环接收到相同的数据,即recv执行后,不会清除底层socket的缓冲区指针,在使用select时,一直提示有读数据,在不使用select循环recv时,永远不会出现0以下结果。直到
2)socket在下次accept时出现段错误。
但同期,使用linux,并无此现象。首先,程序中使用到了没有必要的多余参数,其次,是否说明MacOSX下对于Socket的处理有值得商榷的地方哪?存疑中。 使用下面的方法来设置socket,正常:

    int optval = 1;
    setsockopt(new_fd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, sizeof(int));