C語言listen()函數:等待串連
標頭檔:
定義函數:
int listen(int s, int backlog);
函數說明:listen()用來等待參數s 的socket 連線. 參數backlog 指定同時能處理的最大串連要求, 如果串連數目達此上限則client 端將收到ECONNREFUSED 的錯誤. Listen()並未開始接收連線, 只是設定socket 為listen 模式, 真正接收client 端連線的是accept(). 通常listen()會在socket(), bind()之後調用, 接著才調用accept().
傳回值:成功則返回0, 失敗返回-1, 錯誤原因存於errno
附加說明:listen()只適用SOCK_STREAM 或SOCK_SEQPACKET 的socket 類型. 如果socket 為AF_INET 則參數backlog 最大值可設至128.
錯誤碼:
EBADF 參數sockfd 非合法socket 處理代碼
EACCESS 許可權不足
EOPNOTSUPP 指定的socket 並未支援listen 模式.
C語言bind()函數:對socket定位
標頭檔:
#include <sys/types.h> #include <sys/socket.h>
定義函數:int bind(int sockfd, struct sockaddr * my_addr, int addrlen);
函數說明:bind()用來設定給參數sockfd 的socket 一個名稱. 此名稱由參數my_addr 指向一sockaddr 結構,對於不同的socket domain 定義了一個通用的資料結構
struct sockaddr{ unsigned short int sa_family; char sa_data[14];};
1、sa_family 為調用socket()時的domain 參數, 即AF_xxxx 值.
2、sa_data 最多使用14 個字元長度.
此sockaddr 結構會因使用不同的socket domain 而有不同結構定義, 例如使用AF_INET domain,其socketaddr 結構定義便為
struct socketaddr_in{ unsigned short int sin_family; uint16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8];};struct in_addr{ uint32_t s_addr;};
1、sin_family 即為sa_family
2、sin_port 為使用的port 編號
3、sin_addr. s_addr 為IP 位址 sin_zero 未使用.
參數 addrlen 為sockaddr 的結構長度.
傳回值:成功則返回0, 失敗返回-1, 錯誤原因存於errno 中.
錯誤碼:
1、EBADF 參數sockfd 非合法socket 處理代碼.
2、EACCESS 許可權不足
3、ENOTSOCK 參數sockfd 為一檔案描述詞, 非socket.