设为首页 加入收藏

TOP

Solaris操作系统网络编程经验分享
2014-11-24 01:20:01 来源: 作者: 【 】 浏览:2
Tags:Solaris 操作系统 网络编程 经验 分享

自从2010年我开始在Solaris操作系统进行应用程序开发算起,到现在已经超过3年的时间了。在这里我想把在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错误。感兴趣的朋友也可以参考这里。


以上就是我在Solaris上进行网络程序开发的一点心得,希望分享出来给需要的朋友一点帮助。如果大家有更好的经验,也欢迎分享出来。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Debian下安装Intel C/C++ Compiler 下一篇Python 小程序,实现比较两个列表..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: