linux函式 connect的使用和注意事項

2021-09-08 22:15:31 字數 1922 閱讀 1311

在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 ...