Solaris操作系统网络编程经验分享
经验1:链接动态库选项:-lresolv -lnsl -lsocket。
也许在其它的UNIX系统上,一个”-lsocket”链接选项就能解决所有问题。但是在Solaris系统上,要链接这三个库。
经验2:不支持SO_SNDTIMEO和SO_RCVTIMEO socket选项。
在我用过的Solaris 9和Solaris 10上,这两个socket选项都不支持(我没用过Open Solaris,所以不确定Open Solaris是否支持)。所以尽管这两个宏定义在sys/socket.h,但是却是不起作用的。如果在程序中用到这两个选项,一定要注意这一点。我在使用MySQL,hiredis这些开源代码时都遇到过这个问题。
经验3:使用sctp_bindx之前,一定要先调用bind。
这个可能也是Solaris系统特有的了。我曾经遇到一个使用SCTP的应用程序,在其它系统上跑的好好的,到Solaris上就不行。后来查了一下man手册,才发现需要在调用sctp_bindx之前,要先调用bind。
经验4:shutdown()函数作用于一个listen socket时,会产生ENOTCONN错误
我曾经写过下面的程序:
第一个线程:
{
……
FD_ZERO(&fd_sets);
FD_SET(sock_fd, &fd_sets);
ret_val = select(sock_fd + 1, &fd_sets, NULL, NULL, NULL);
if (ret_val > 0)
{
accept(sock_fd, NULL, NULL);
……
}
else
{
……
}
}
第二个线程:
{
……
shutdown(sock_fd, SHUT_RD);
……
}
其中第一个线程阻塞在select函数,sock_fd是一个listen socket。我本意是在第二个线程中调用shutdown函数,使第一个线程的select返回,结果却发现没有生效,后来才发现shutdown返回了一个ENOTCONN错误。感兴趣的朋友也可以参考这里。
以上就是我在S