在linux中的socket程式設計中,建立網路連線是通過connect函式來完成的,函式原型為:
int connect (int sockfd, struct sockaddr * serv_addr, int addrlen)
addrlen: 為傳入引數sockaddr結構體的大小,該引數實際應該是乙個傳出引數。
首先,阻塞和非阻塞不是connect函式的屬性。而是通過socket的函式獲取的檔案描述符所指向的抽象檔案的屬性。
所以需要通過操作socket獲取的檔案描述符fd(file descriptor)來對其設定為非阻塞,預設情況下,socket檔案的屬性為阻塞的。
接下來是獲取乙個阻塞的socket檔案描述符
int fd = socket(af_inet6,sock_stream,0); //af_inet:指定為ipv6協議族,sock_stream:面向流的連線,第三個為0就好,該引數是指定具體協議
//由於預設的socket就是阻塞的,所以可以直接將該獲取的fd加入到connect的第乙個引數中。即完成了第乙個引數的設定
//通過乙個ipv6的位址字串和埠獲取乙個sockaddr_in6
struct sockaddr_in6 addr6; //定義乙個sockaddr_in6
addr6.sin6_family = af_inet6; //指定該sockaddr_in6的協議為ipv6協議
addr6.sin6_port = htons(80); //指定連線的埠,htons()函式是將乙個本地位元組序的short轉為網路位元組序的short
inet_pton(af_inet6, "::1", &addr6.sin6_addr); //指定連線的ipv6位址,inet_pton是將ipv6的位址字串轉為網路位元組序傳輸的字串
//這樣就完成了connect的第二個引數的設定
//獲取sockaddr_in6的長度
int len = sizeof(sockaddr_in6);
//即完成了第三個引數的設定
//呼叫connect函式進行連線,即完成了整個過程: 連線成功flag返回0,連線失敗flag返回-1
int flag = connect(fd,&addr6,len);
注:inet_pton和socket都有可能呼叫失敗,從而需要對其返回值進行相應的錯誤處理
對於非阻塞的connect的連線,其不會在呼叫connect的時候進行阻塞,而是立即返回。如果返回0,說明呼叫connect的時候還沒來得及讓connect返回便已經建立了連線;而如果返回-1,errno會記錄乙個錯誤碼,如果該錯誤碼為einprogress。則說明該連線還正在建立,並不能說明該連線出錯。乙個非阻塞connect的簡單測試。
int flag;
int fd = socket(af_inet,sock_stream,0);
flag = fcntl(connect_fd,f_getfl,0); //獲取檔案描述符的屬性
fcntl(connect_fd, f_setfl, flag|o_nonblock); //將檔案描述符的屬性設定為非阻塞
struct sockaddr_in addr=;
addr.sin_family= af_inet;
addr.sin_port = htons(80);
inet_pton(af_inet, "127.0.0.1", &addr.sin_addr);
for(;;)elseelse
} }
通常如果connect函式可以最終被呼叫成功會列印"connection is being established"和"connect success!"。
注意:fcntl函式對檔案描述符進行設定和獲取的時候需要對其返回值做校驗
Linux網路程式設計connect 函式的使用
在乙個 client server模型的網路應用中,客戶端的呼叫序列大致如下 socket connect recv send close 其中socket沒有什麼可疑問的,主要是建立乙個套接字用於與服務端交換資料,並且通常它會迅速返回,此時並沒有資料通過網絡卡傳送出去,而緊隨其後的connect函...
connect函式詳解
不得不說,客戶端的connect函式和服務端的accept函式是一對好 如果客戶端沒有去connect,那麼服務端的accept會一直在那裡傻傻地痴痴地等待,我們先來看看connect函式的原型吧 winsock api linkage intwsaapi connect socket s,cons...
connect函式介紹
include see notes include intconnect int sockfd,const struct sockaddr addr,socklen t addrlen sockdf socket檔案描述符 addr 傳入引數,指定伺服器端位址資訊,含ip位址和埠號 addrlen ...