Linux的socket API主要包括以下幾個關鍵函數:
- socket():創建一個新的socket。這個函數需要指定協議族(如AF_INET表示IPv4,AF_INET6表示IPv6)、socket類型(如SOCK_STREAM表示TCP流,SOCK_DGRAM表示UDP數據報)和協議號(通常為0,表示由操作系統自動選擇合適的協議)。成功時返回一個非負整數,表示socket的文件描述符;失敗時返回-1并設置errno。
- bind():將socket與一個本地地址和端口綁定。這個函數需要傳入一個socket文件描述符、一個指向sockaddr結構體的指針(包含了地址和端口信息)以及該結構體的大小。成功時返回0;失敗時返回-1并設置errno。
- connect():連接到一個遠程地址和端口。這個函數需要傳入一個socket文件描述符、一個指向sockaddr結構體的指針(包含了遠程地址和端口信息)以及該結構體的大小。成功時返回0;失敗時返回-1并設置errno。
- listen():將socket設置為監聽模式,等待客戶端連接。這個函數需要傳入一個socket文件描述符和一個整數backlog,表示可以同時處理的最大連接請求數。成功時返回0;失敗時返回-1并設置errno。
- accept():接受一個來自客戶端的連接請求。這個函數需要傳入一個socket文件描述符、一個指向sockaddr結構體的指針(用于存儲客戶端地址信息)以及一個指向整數的指針(用于存儲客戶端地址結構體的大小)。成功時返回一個新的socket文件描述符,表示與客戶端的連接;失敗時返回-1并設置errno。
- send()/sendto():發送數據。send()函數用于TCP連接,需要傳入一個socket文件描述符、一個指向數據的指針、數據長度以及一組標志位。sendto()函數用于UDP數據報,除了需要傳入一個socket文件描述符、一個指向數據的指針、數據長度以外,還需要傳入一個指向目標地址的指針和目標地址結構體的大小。成功時返回實際發送的字節數;失敗時返回-1并設置errno。
- recv()/recvfrom():接收數據。recv()函數用于TCP連接,需要傳入一個socket文件描述符、一個指向接收緩沖區的指針、緩沖區大小以及一組標志位。recvfrom()函數用于UDP數據報,除了需要傳入一個socket文件描述符、一個指向接收緩沖區的指針、緩沖區大小以外,還需要傳入一個指向源地址的指針和源地址結構體的大小。成功時返回實際接收的字節數;失敗時返回-1并設置errno。
- close():關閉一個socket。這個函數需要傳入一個socket文件描述符。成功時返回0;失敗時返回-1并設置errno。
這些函數是使用Linux socket API進行網絡編程的基礎,可以實現各種網絡應用,如TCP服務器、UDP客戶端等。