溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Socket 編程 connect() 函數(shù)

發(fā)布時(shí)間:2020-07-07 03:34:16 來源:網(wǎng)絡(luò) 閱讀:936 作者:li19910110 欄目:編程語言

connect()用于建立與指定socket的連接。

頭文件: #include <sys/socket.h>

函數(shù)原型: int connect(int s, const struct sockaddr * name, int namelen);

參數(shù):

s:標(biāo)識(shí)一個(gè)未連接socket

name:指向要連接套接字的sockaddr結(jié)構(gòu)體的指針

namelen:sockaddr結(jié)構(gòu)體的字節(jié)長(zhǎng)度

注釋:


本函數(shù)用于創(chuàng)建與指定外部端口的連接。s參數(shù)指定一個(gè)未連接的數(shù)據(jù)報(bào)或流類套接口。如套接口未被捆綁,則系統(tǒng)賦給本地關(guān)聯(lián)一個(gè)唯一的值,且設(shè)置套接口為已捆綁。請(qǐng)注意若名字結(jié)構(gòu)中的地址域?yàn)槿愕脑?,則connect()將返回WSAEADDRNOTAVAIL錯(cuò)誤。

對(duì)于流類套接口(SOCK_STREAM類型),利用名字來與一個(gè)遠(yuǎn)程主機(jī)建立連接,一旦套接口調(diào)用成功返回,它就能收發(fā)數(shù)據(jù)了。對(duì)于數(shù)據(jù)報(bào)類套接口(SOCK_DGRAM類型),則設(shè)置成一個(gè)缺省的目的地址,并用它來進(jìn)行后續(xù)的send()與recv()調(diào)用。

函數(shù)說明

connect()用來將參數(shù)sockfd 的socket 連至參數(shù)serv_addr 指定的網(wǎng)絡(luò)地址. 結(jié)構(gòu)sockaddr請(qǐng)參考bind(). 參數(shù)addrlen 為sockaddr 的結(jié)構(gòu)長(zhǎng)度.
  返回值:成功則返回0, 失敗返回-1, 錯(cuò)誤原因存于errno 中.[1] 

返回值:

若無錯(cuò)誤發(fā)生,則connect()返回0。否則的話,返回SOCKET_ERROR錯(cuò)誤,應(yīng)用程序可通過WSAGetLastError()獲取相應(yīng)錯(cuò)誤代碼。對(duì)非阻塞套接口而言,若返回值為SOCKET_ERROR則應(yīng)用程序調(diào)用WSAGetLsatError()。如果它指出錯(cuò)誤代碼為WSAEWOULDBLOCK,則您的應(yīng)用程序可以:

1.用select(),通過檢查套接口是否可寫,來確定連接請(qǐng)求是否完成。

2.如果您的應(yīng)用程序使用基于消息的WSAAsynSelect()來表示對(duì)連接事件的興趣,則當(dāng)連接操作完成后,您會(huì)收到一個(gè)FD_CONNECT消息。

錯(cuò)誤代碼:

WSAENOTINITIALISED:在使用此API之前應(yīng)首先成功地調(diào)用WSAStartup()。

WSAENETDOWN:套接口實(shí)現(xiàn)檢測(cè)到網(wǎng)絡(luò)子系統(tǒng)失效。

WSAEADDRINUSE:所指的地址已在使用中。

WSAEINTR:通過一個(gè)WSACancelBlockingCall()來取消一個(gè)(阻塞的)調(diào)用。

WSAEINPROGRESS:一個(gè)阻塞的套接口調(diào)用正在運(yùn)行中。

WSAEADDRNOTAVAIL:在本地機(jī)器上找不到所指的地址。

WSAENOTSUPPORT:所指族中地址無法與本套接口一起使用。

WSAECONNREFUSED:連接嘗試被強(qiáng)制拒絕。

WSAEDESTADDREQ:需要目的地址。

WSAEFAULT:namelen參數(shù)不正確。

WSAEINVAL:套接口沒有準(zhǔn)備好與一地址捆綁。

WSAEISCONN:套接口早已連接。

WSAEMFILE:無多余文件描述字。

WSAENETUNREACH:當(dāng)前無法從本主機(jī)訪問網(wǎng)絡(luò)。

WSAENOBUFS:無可用緩沖區(qū)。套接口未被連接。

WSAENOTSOCK:描述字不是一個(gè)套接口。

WSAETIMEOUT:超時(shí)時(shí)間到。

WSAEWOULDBLOCK:套接口設(shè)置為非阻塞方式且連接不能立即建立。可用select()調(diào)用對(duì)套接口寫,因?yàn)閟elect()時(shí)會(huì)進(jìn)行連接。[1] 

參見

accept(), bind(), getsockname(), socket(), select(), WSAAsyncSelect().


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI