本來以爲用setsockopt修改個什麼參數就可以搞定,結果baidu了半天也沒有結果。倒是在網上搜到很多這樣的解決方案:將connect方式設置爲非阻塞方式,這樣程序一旦執行就會馬上返回,但問題是,到底有沒有連接上呢,你需要等待一段時間,然後使用函數判斷連接是否正常。試了下,貌似由於系統的區別,這個方法在我的linux環境下不適用,主要是後面判斷是否連接上的函數不行,不管連接上或沒連接上都返回一個值。
看來網上的方法也不能盡信,最後在公司前人的一段代碼裏面找到了解決方法,這裏分享下:
- sigset(SIGALRM, u_alarm_handler);
- alarm(2);
- code = connect(socket_fd,
(struct sockaddr*)&socket_st, sizeof(struct sockaddr_in));
- alarm(0);
- sigrelse(SIGALRM);
其中,處理函數可以如下定義,也可以加入更多的錯誤處理。
- void u_alarm_handler()
- {
- }
這個方法相對網上的做法而言代碼量小,更精巧,看來老代碼也是有很多值得學習的地方。
http://blog.chinaunix.net/space.php?uid=16792259&do=blog&id=3064785