connect() - Unix,Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論區     關於 TP  

connect() - Unix,Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

connect - 在套接字上啟動連線

概要

#include <sys/types.h> 
#include <sys/socket.h> 

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

描述

connect() 系統呼叫將檔案描述符 sockfd 引用的套接字連線到 serv_addr 指定的地址。addrlen 引數指定 serv_addr 的大小。serv_addr 中地址的格式由套接字 sockfd 的地址空間確定;有關更多詳細資訊,請參見 socket(2)。

如果套接字 sockfd 的型別為 SOCK_DGRAM,則 serv_addr 是預設情況下資料報傳送到的地址,也是僅接收資料報的地址。如果套接字的型別為 SOCK_STREAMSOCK_SEQPACKET,則此呼叫嘗試連線到繫結到 serv_addr 指定的地址的套接字。

通常,基於連線的協議套接字可能只能成功呼叫 connect() 一次;無連線協議套接字可以使用 connect() 多次來更改其關聯。無連線套接字可以透過將 sockaddrsa_family 成員設定為 AF_UNSPEC 來連線到一個地址來解散關聯。

返回值

如果連線或繫結成功,則返回零。如果出錯,則返回 -1,並且 errno 被相應地設定。

錯誤

以下僅是一般的套接字錯誤。可能還有其他特定於域的錯誤程式碼。

錯誤程式碼描述
EACCES 對於由路徑名標識的 Unix 域套接字:對套接字檔案寫入許可權被拒絕,或者對路徑字首中的一個目錄搜尋許可權被拒絕。(另請參見 path_resolution(2)。)
EACCES, EPERM 使用者嘗試連線到廣播地址,但未啟用套接字廣播標誌,或者由於本地防火牆規則導致連線請求失敗。
EADDRINUSE 本地地址已經在使用中。
EAFNOSUPPORT 傳遞的地址在其 sa_family 欄位中沒有正確的地址族。
EADDRNOTAVAIL 請求不存在的介面或請求的地址不是本地的。
EALREADY 套接字是非阻塞的,並且之前的連線嘗試尚未完成。
EBADF 檔案描述符不是描述符表中的有效索引。
ECONNREFUSED 遠端地址上沒有人監聽。
EFAULT 套接字結構地址位於使用者地址空間之外。
EINPROGRESS 套接字是非阻塞的,並且連線無法立即完成。可以透過選擇用於寫入的套接字來選擇(2)或輪詢(2)以完成。在select(2)指示可寫性後,使用getsockopt(2)讀取級別SOL_SOCKETSO_ERROR選項以確定connect()是否成功完成(SO_ERROR為零)或不成功(SO_ERROR是此處列出的常用錯誤程式碼之一,解釋了失敗的原因)。
EINTR 系統呼叫被捕獲的訊號中斷。
EISCONN 套接字已連線。
ENETUNREACH 網路不可達。
ENOTSOCK 檔案描述符未與套接字關聯。
ETIMEDOUT 嘗試連線時超時。伺服器可能太忙而無法接受新的連線。請注意,對於 IP 套接字,當在伺服器上啟用 syncookies 時,超時可能會非常長。

符合標準

SVr4, 4.4BSD(connect() 函式首次出現在 4.2BSD 中)。

注意

connect() 的第三個引數實際上是一個 int(這就是 4.x BSD 和 libc4 和 libc5 所具有的)。一些 POSIX 混淆導致了現在的 socklen_t,glibc 也使用它。另請參見 accept(2)。

缺陷

使用帶有 AF_UNSPEC 地址的 connect() 呼叫斷開套接字連線尚未實現。

參見



previous next Printer Friendly

廣告


  

廣告



廣告