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 核心內存不足.
新聞熱點
疑難解答
圖片精選