自從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上進行網絡程序開發的一點心得,希望分享出來給需要的朋友一點幫助。如果大家有更好的經驗,也歡迎分享出來。