//原文地址:http://blog.csdn.net/saspss/article/details/8487678
、、、、
今天,在調試socket,非阻塞模式下,發現連接服務器時connect老是回復-1,很是苦惱。后來,看到某一個前輩的代碼,思路和下面這篇文章差不多意思。
就是,非阻塞模式下的連接服務器,要判斷下返回值,是否是einprogress,如果是,說明這個socket應該是好的。
將文章轉載過來,供遇到問題的童鞋參考。
、、、、
今天在開發游戲客戶端測試程序時,由于出現很多客戶端,經過connect成功后,代碼卡在recv系統調用中,后來發現可能是由于socket默認是阻塞模式,所以會令很多客戶端
鏈接處于鏈接卻不能傳輸數據狀態。
后來修改socket為非阻塞模式,但在connect的時候,發現返回值為-1,剛開始以為是connect出現錯誤,但在服務器上看到了鏈接是ESTABLISED狀態。證明鏈接是成功的
但為什么會出現返回值是-1呢? 經過查詢資料,以及看stevens的APUE,也發現有這么一說。
當connect在非阻塞模式下,會出現返回-1值,錯誤碼是EINPROGRESS,但如何判斷connect是聯通的呢?stevens書中說明要在connect后,繼續判斷該socket是否可寫?
若可寫,則證明鏈接成功。如何判斷可寫,有2種方案,一種是select判斷是否可寫,二用poll模型。
select:
int CheckConnect(int iSocket) { fd_set rset;
FD_ZERO(&rset); FD_SET(iSocket, &rset);
timeval tm; tm. tv_sec = 0; tm.tv_usec = 0; if ( select(iSocket + 1, NULL, &rset, NULL, &tval) <= 0) { close(iSocket); return -1; } if (FD_ISSET(iSocket, &rset)) { int err = -1; socklen_t len = sizeof(int); if ( getsockopt(iSocket, SOL_SOCKET, SO_ERROR ,&err, &len) < 0 ) { close(iSocket); printf(“errno:%d %sn”, errno, strerror(errno)); return -2; } if (err) { errno = err; close(iSocket); return -3; } }
return 0; }
poll:
int CheckConnect(int iSocket) {struct pollfd fd;int ret = 0;socklen_t len = 0;fd.fd = iSocket;fd.events = POLLOUT;while ( poll (&fd, 1, -1) == -1 ) {if( errno != EINTR ){perror("poll");return -1;}}len = sizeof(ret);if ( getsockopt (iSocket, SOL_SOCKET, SO_ERROR, &ret, &len) == -1 ) { perror("getsockopt");return -1;}if(ret != 0) {fprintf (stderr, "socket %d connect failed: %sn", iSocket, strerror (ret));return -1;}return 0;}
160510.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
歪歪如何設置鮮花?斜置花的方法如下:1。當等級達到16級時,可以送出一束鮮花。在我的花里,你可以設定一束花的數目。2. 渠道經理可以根據當前渠道刷花的情況,禁止送花或調整花的大小?;ǖ拇笮〔煌簑aiwai voice是廣州多灣信息技術有限公司開發的基于互聯網的團隊語音通信平臺,是一款功能強大、音質清晰、安全穩定、不占用資源、適合游戲玩家的免費語音軟件。在網絡上通常用YY來表示。簡而言之,它是一種...
北京到重慶機票含燃油費嗎?不要!去重慶的機票價格不包括燃油稅和機場建設費。支付機票時,系統會自動添加這些費用。自2009年11月起,國內機票燃油成本與航空煤油價格聯動機制開始實施。燃油費標準按長短航線兩檔定額計算。800公里(含)以下航線按800公里計算,800公里以上航線統一按1500公里計算。國內航空煤油綜合采購成本超過基準油價100元每噸4140元,燃油單位征收率每公里不超過0.002908...
怎么打彩色字? 怎么打彩色字? 2 .點擊 "顏色選擇 "按鈕,選擇一種顏色并保存。修改后的效果如下:怎樣打彩字?1.登錄,進入主界面。2.點擊任意一個朋友,打開對話框。3.打開對話框后,輸入1.登錄您的帳戶,選擇一個朋友進入聊天界面。3.然后選擇最后一個聊天工具,點擊打開。打開最右邊像畫板一樣的圖標,點擊打開,會出現一個彩色的畫板,可以選擇自己喜歡的聊天顏色。上的彩色字怎么打出來?上打彩色字的方...