(1)connect描述 錯誤

2021-07-04 06:05:10 字數 1996 閱讀 5479

2010-03-10 11:14

22049人閱讀收藏 

舉報socket

tcp伺服器

多執行緒struct網路

(1)connect描述

定義函式:

int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

connect函式通常用於客戶端建立tcp連線。

返回值:

成功則返回0,失敗返回-1,錯誤原因存於errno中。

錯誤**: 

ebadf 引數sockfd 非合法socket處理**

efault 引數serv_addr指標指向無法訪問的記憶體空間

enotsock 引數sockfd為一檔案描述詞,非socket。

eisconn 引數sockfd的socket已是連線狀態

econnrefused 連線要求被server端拒絕。

etimedout 企圖連線的操作超過限定時間仍未有響應。

enetunreach 無法傳送資料報至指定的主機。

eafnosupport sockaddr結構的sa_family不正確。

ealready socket為不可阻塞且先前的連線操作還未完成。

(2)socket中連線過程比較

connect是套接字連線操作,connect操作之後代表對應的套接字已連線,udp協議在建立套接字之後,可以同多個伺服器端建立通訊,而tcp協議只能與乙個伺服器端建立通訊,tcp不允許目的位址是廣播或多播位址,udp允許。當然udp協議也可以像tcp協議一樣,通過connect來指定對方的ip位址、埠。

udp協議經過connect之後,在通過sendto來傳送資料報時不需要指定目的位址、埠,如果指定了目的位址、埠,那麼會返回錯誤。通過udp協議可以給同乙個套接字指定多次connect操作,而tcp協議不可以,tcp只能指定一次connect操作。udp協議指定第二次connect操作之後會先斷口第一次的連線,然後建立第二次的連線。

(3)客戶端在建立同伺服器端的連線過程

第一步都會通過socket建立連線套接字;

第二步通過bind來繫結本地位址、本地埠,當然繫結操作可以不用指定;

對於udp協議:若未指定繫結操作,那麼可以通過下面connect操作來由核心負責套接字的繫結操作,若

connect又未指定,那麼繫結操作只好通過套接字的寫操作(sendto、sendmsg)來指定目的位址、埠,這時

套接字本地位址不會指定,為通配位址,而本地埠由核心指定,第一次sendto操作之後,插口的本地埠經

過核心指定之後就不會更改。

對於tcp協議:若未指定繫結操作,可以通過下面connect操作來由核心負責套接字的繫結操作。核心會根

據套接字中的目的位址來判斷外出介面,然後指定該外出介面的ip位址為插口的本地位址。connect操作對於tcp

協議的客戶端是必不可少的,必須指定。

(4)非阻塞的 socket connect 

非阻塞模式有3種用途

1.三次握手同時做其他的處理。connect要花乙個往返時間完成,從幾毫秒的區域網到幾百毫秒或幾秒的廣域網。這段時間可能有一些其他的處理要執行,比如資料準備,預處理等。

2.用這種技術建立多個連線。這在web瀏覽器中很普遍.

3.由於程式用select等待連線完成,可以設定乙個select等待時間限制,從而縮短connect超時時間。多數實現中,connect的超時時間在75秒到幾分鐘之間。有時程式希望在等待一定時間內結束,使用非阻塞connect可以防止阻塞75秒,在多執行緒網路程式設計中,尤其必要。   例如有乙個通過建立執行緒與其他主機進行socket通訊的應用程式,如果建立的執行緒使用阻塞connect與遠端通訊,當有幾百個執行緒併發的時候,由於網路延遲而全部阻塞,阻塞的執行緒不會釋放系統的資源,同一時刻阻塞執行緒超過一定數量時候,系統就不再允許建立新的執行緒(每個程序由於程序空間的原因能產生的執行緒有限),如果使用非阻塞的connect,連線失敗使用select等待很短時間,如果還沒有連線後,執行緒立刻結束釋放資源,防止大量執行緒阻塞而使程式崩潰。

tuxedo 錯誤號及錯誤資訊描述 tperrno

近幾天在檢視tuxedo服務端返回客戶端資訊發現了許多tperrno 在這裡我把tuxedo errno 對應的資訊描述出來。tperrno 1 tpeabort transaction cannot commit tperrno 2 tpebaddesc bad communication des...

錯誤碼及其文字描述

1.dword getlasterror 可以獲得系統函式或客戶端函式呼叫失敗的錯誤碼 客戶端函式呼叫過程中可以利用void setlasterror dword dwerrorcode 來設定客戶端函式呼叫失敗的錯誤碼!2.dword formatmessage dword dwflags,系統相...

Linux中錯誤碼及描述

每次執行乙個命令,linux都會返回乙個錯誤碼 整數,一般為0 256 那麼這些數字都表示什麼意思呢?今天強子告訴大家3種方法 注 我的平台的fedora 7,其他平台可參考 1.簡單明瞭,乙個命令,想看什麼看什麼 perror 如 perror 0 表示success,perror 1表示oper...