C語言中socket相關網路編程函數小結_C 語言

來源:互聯網
上載者:User

C語言socket()函數:建立一個socket通訊
標頭檔:

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

定義函數:

int socket(int domain, int type, int protocol);

函數說明:socket()用來建立一個新的socket, 也就是向系統註冊, 通知系統建立一通訊連接埠. 參數domain 指定使用何種的地址類型, 完整的定義在/usr/include/bits/socket.h 內, 底下是常見的協議:
   PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX 進程通訊協定
   PF_INET?AF_INET Ipv4 網路通訊協定
   PF_INET6/AF_INET6 Ipv6 網路通訊協定
   PF_IPX/AF_IPX IPX-Novell 協議
   PF_NETLINK/AF_NETLINK 核心使用者介面裝置
   PF_X25/AF_X25 ITU-T X. 25/ISO-8208 協議
   PF_AX25/AF_AX25 業餘無線AX. 25 協議
   PF_ATMPVC/AF_ATMPVC 存取原始 ATM PVCs
   PF_APPLETALK/AF_APPLETALK appletalk (DDP)協議
   PF_PACKET/AF_PACKET 初級封包介面

參數 type 有下列幾種數值:
1、SOCK_STREAM 提供雙向連續且可信賴的資料流, 即TCP. 支援 OOB 機制, 在所有資料傳送前必須使用connect()來建立連線狀態.
2、SOCK_DGRAM 使用不連續不可信賴的資料包串連
3、SOCK_SEQPACKET 提供連續可信賴的資料包串連
4、SOCK_RAW 提供原始網路通訊協定存取
5、SOCK_RDM 提供可信賴的資料包串連
6、SOCK_PACKET 提供和網路驅動程式直接通訊. protocol 用來指定socket 所使用的傳輸協議編號, 通常此參考不用管它, 設為0 即可.

傳回值:成功則返回socket 處理代碼, 失敗返回-1.

錯誤碼:
1、EPROTONOSUPPORT 參數domain 指定的類型不支援參數type 或protocol 指定的協議
2、ENFILE 核心記憶體不足, 無法建立新的socket 結構
3、EMFILE 進程檔案表溢出, 無法再建立新的socket
4、EACCESS 許可權不足, 無法建立type 或protocol 指定的協議
5、ENOBUFS/ENOMEM 記憶體不足
6、EINVAL 參數domain/type/protocol 不合法

C語言connect()函數:建立socket連線
標頭檔:

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

定義函數:

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

函數說明:connect()用來將參數sockfd 的socket 連至參數serv_addr 指定的網路地址. 結構sockaddr請參考bind(). 參數addrlen 為sockaddr 的結構長度.

傳回值:成功則返回0, 失敗返回-1, 錯誤原因存於errno 中.

錯誤碼:
1、EBADF 參數sockfd 非合法socket 處理代碼
2、EFAULT 參數serv_addr 指標指向無法存取的記憶體空間
3、ENOTSOCK 參數sockfd 為一檔案描述詞, 非socket.
4、EISCONN 參數sockfd 的socket 已是連線狀態
5、   ETIMEDOUT 企圖連線的操作超過限定時間仍未有響應.
6、ENETUNREACH 無法傳送資料包至指定的主機.
7、EAFNOSUPPORT sockaddr 結構的sa_family 不正確.
8、EALREADY socket 為不可阻斷且先前的連線操作還未完成.

C語言accept()函數:接受socket連線
標頭檔:

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

定義函數:

int accept(int s, struct sockaddr * addr, int * addrlen);

函數說明:accept()用來接受參數s 的socket 連線. 參數s 的socket 必需先經bind()、listen()函數處理過, 當有連線進來時accept()會返回一個新的socket 處理代碼, 往後的資料傳送與讀取就是經由新的socket處理, 而原來參數s 的socket 能繼續使用accept()來接受新的連線要求. 連線成功時, 參數addr 所指的結構會被系統填入遠程主機的地址資料, 參數addrlen 為scokaddr 的結構長度. 關於機構sockaddr 的定義請參考bind().

傳回值:成功則返回新的socket 處理代碼, 失敗返回-1, 錯誤原因存於errno 中.

錯誤碼:
1、EBADF 參數s 非合法socket 處理代碼.
2、EFAULT 參數addr 指標指向無法存取的記憶體空間.
3、ENOTSOCK 參數s 為一檔案描述詞, 非socket.
4、EOPNOTSUPP 指定的socket 並非SOCK_STREAM.
5、EPERM 防火牆拒絕此連線.
6、ENOBUFS 系統的緩衝記憶體不足.
7、ENOMEM 核心記憶體不足.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.