引言
本文將深入探討使用套接字進(jìn)行網(wǎng)絡(luò)通信的基本步驟,包括創(chuàng)建套接字、綁定地址、監(jiān)聽連接(對于服務(wù)器端)、連接遠(yuǎn)程主機(jī)(對于客戶端)、以及發(fā)送和接收數(shù)據(jù)等操作。套接字編程涉及一系列系統(tǒng)調(diào)用和函數(shù),如 socket()
、bind()
、listen()
、connect()
、send()
、recv()
等。開發(fā)人員可以利用這些接口實(shí)現(xiàn)各種網(wǎng)絡(luò)應(yīng)用。通過本文,讀者將了解如何使用套接字進(jìn)行網(wǎng)絡(luò)通信,并掌握關(guān)鍵步驟和函數(shù)調(diào)用,為構(gòu)建網(wǎng)絡(luò)應(yīng)用打下堅(jiān)實(shí)基礎(chǔ)。
一、socket 常見API表
函數(shù) | 描述 |
---|---|
socket() | 創(chuàng)建一個(gè)新的套接字 |
bind() | 將套接字綁定到特定的IP地址和端口號上 |
listen() | 將套接字標(biāo)記為被動套接字,用于監(jiān)聽連接請求 |
accept() | 接受客戶端的連接請求,并返回一個(gè)新的套接字用于通信 |
connect() | 建立與服務(wù)器端的連接 |
send() | 發(fā)送數(shù)據(jù) |
recv() | 接收數(shù)據(jù) |
sendto() | 用于UDP協(xié)議中發(fā)送數(shù)據(jù) |
recvfrom() | 用于UDP協(xié)議中接收數(shù)據(jù) |
close() | 關(guān)閉套接字連接 |
select() | 多路復(fù)用,同時(shí)監(jiān)視多個(gè)套接字的狀態(tài) |
getaddrinfo() | 主機(jī)名和服務(wù)名之間的轉(zhuǎn)換 |
setsockopt() | 設(shè)置套接字選項(xiàng) |
getsockopt() | 獲取套接字選項(xiàng)的值 |
inet_pton() | IP地址的轉(zhuǎn)換 |
inet_ntop() | IP地址的轉(zhuǎn)換 |
htons() | 主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換(16位整數(shù)) |
ntohs() | 主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換(16位整數(shù)) |
htonl() | 主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換(32位整數(shù)) |
ntohl() | 主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換(32位整數(shù)) |
二、函數(shù)詳細(xì)介紹
01. socket()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int socket(int domain, int type, int protocol);
-
參數(shù)類型:
- domain:協(xié)議族(如AF_INET、AF_INET6等)
- type:套接字類型(如SOCK_STREAM、SOCK_DGRAM等)
- protocol:具體使用的協(xié)議(如IPPROTO_TCP、IPPROTO_UDP等)
-
應(yīng)用示例:
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
02. bind()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- addr:指向要綁定的地址結(jié)構(gòu)的指針
- addrlen:地址結(jié)構(gòu)的長度
-
應(yīng)用示例:
struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_port = htons(12345); server_address.sin_addr.s_addr = INADDR_ANY; bind(sockfd, (struct sockaddr *)&server_address, sizeof(server_address));
03. listen()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int listen(int sockfd, int backlog);
-
參數(shù)類型:
- sockfd:套接字描述符
- backlog:未完成連接隊(duì)列的最大長度
-
應(yīng)用示例:
listen(sockfd, 5);
04. accept()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- addr:指向結(jié)構(gòu)體的指針,用于存儲客戶端地址信息
- addrlen:地址結(jié)構(gòu)的長度
-
應(yīng)用示例:
int client_sockfd = accept(sockfd, (struct sockaddr *)&client_address, &addr_len);
05. connect()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- addr:指向要連接的目標(biāo)地址結(jié)構(gòu)的指針
- addrlen:地址結(jié)構(gòu)的長度
-
應(yīng)用示例:
connect(sockfd, (struct sockaddr *)&server_address, sizeof(server_address));
06. send()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:ssize_t send(int sockfd, const void *buf, size_t len, int flags);
-
參數(shù)類型:
- sockfd:套接字描述符
- buf:指向待發(fā)送數(shù)據(jù)的指針
- len:待發(fā)送數(shù)據(jù)的長度
- flags:傳輸控制標(biāo)志
-
應(yīng)用示例:
char *message = "Hello, server!"; send(sockfd, message, strlen(message), 0);
07. recv()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:ssize_t recv(int sockfd, void *buf, size_t len, int flags);
-
參數(shù)類型:
- sockfd:套接字描述符
- buf:指向存儲接收數(shù)據(jù)的緩沖區(qū)
- len:接收數(shù)據(jù)的最大長度
- flags:接收操作的附加選項(xiàng)
-
應(yīng)用示例:
char buffer[1024]; ssize_t bytes_received = recv(sockfd, buffer, 1024, 0);
08. close()
-
頭文件:#include <unistd.h>
-
函數(shù)原型:int close(int sockfd);
-
參數(shù)類型:
- sockfd:要關(guān)閉的套接字描述符
-
應(yīng)用示例:
close(sockfd);
09. select()
-
頭文件:#include <sys/select.h>
-
函數(shù)原型:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
-
參數(shù)類型:
- nfds:所有文件描述符的范圍(最大文件描述符+1)
- readfds:可讀文件描述符集合
- writefds:可寫文件描述符集合
- exceptfds:異常文件描述符集合
- timeout:超時(shí)時(shí)間
-
應(yīng)用示例:
fd_set readfds; FD_ZERO(&readfds); FD_SET(sockfd, &readfds); int activity = select(sockfd + 1, &readfds, NULL, NULL, NULL);
10. getaddrinfo()
-
頭文件:#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h> -
函數(shù)原型:int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
-
參數(shù)類型:
- node:主機(jī)名或IP地址字符串
- service:服務(wù)名或端口號字符串
- hints:指向地址信息結(jié)構(gòu)的指針,用于設(shè)置期望的返回結(jié)果
- res:指向存儲結(jié)果的鏈表的指針
-
應(yīng)用示例:
struct addrinfo hints, *res; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; getaddrinfo("www.example.com", "http", &hints, &res);
11. sendto()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- buf:指向待發(fā)送數(shù)據(jù)的指針
- len:待發(fā)送數(shù)據(jù)的長度
- flags:傳輸控制標(biāo)志
- dest_addr:目標(biāo)地址結(jié)構(gòu)
- addrlen:目標(biāo)地址結(jié)構(gòu)的長度
-
應(yīng)用示例:
char *message = "Hello, server!"; sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&server_address, sizeof(server_address));
12. recvfrom()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- buf:指向存儲接收數(shù)據(jù)的緩沖區(qū)
- len:接收數(shù)據(jù)的最大長度
- flags:接收操作的附加選項(xiàng)
- src_addr:發(fā)送方地址結(jié)構(gòu)
- addrlen:發(fā)送方地址結(jié)構(gòu)的長度
-
應(yīng)用示例:
char buffer[1024]; struct sockaddr_in client_address; socklen_t addr_len = sizeof(client_address); ssize_t bytes_received = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr *)&client_address, &addr_len);
13. setsockopt()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- level:選項(xiàng)所在的協(xié)議層
- optname:選項(xiàng)名
- optval:指向設(shè)置選項(xiàng)值的指針
- optlen:選項(xiàng)值的長度
-
應(yīng)用示例:
int reuse = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
14. getsockopt()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
-
參數(shù)類型:
- sockfd:套接字描述符
- level:選項(xiàng)所在的協(xié)議層
- optname:選項(xiàng)名
- optval:指向存儲選項(xiàng)值的緩沖區(qū)
- optlen:輸入時(shí)為緩沖區(qū)大小,輸出時(shí)為實(shí)際選項(xiàng)值的長度
-
應(yīng)用示例:
int buffer_size; socklen_t optlen = sizeof(buffer_size); getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &buffer_size, &optlen);
15. shutdown()
-
頭文件:#include <sys/socket.h>
-
函數(shù)原型:int shutdown(int sockfd, int how);
-
參數(shù)類型:
- sockfd:套接字描述符
- how:關(guān)閉連接的方式,常用的取值為:
- SHUT_RD:關(guān)閉讀端
- SHUT_WR:關(guān)閉寫端
- SHUT_RDWR:同時(shí)關(guān)閉讀寫端
-
應(yīng)用示例:
shutdown(sockfd, SHUT_RDWR);
16. inet_pton()
-
頭文件:#include <arpa/inet.h>
-
函數(shù)原型:int inet_pton(int af, const char *src, void *dst);
-
參數(shù)類型:
- af:地址族,如AF_INET(IPv4)或AF_INET6(IPv6)
- src:待轉(zhuǎn)換的點(diǎn)分十進(jìn)制字符串形式的地址
- dst:存儲轉(zhuǎn)換后的二進(jìn)制格式地址的緩沖區(qū)
-
應(yīng)用示例:
struct sockaddr_in server_address; inet_pton(AF_INET, "127.0.0.1", &(server_address.sin_addr));
17. htons() / htonl() / ntohs() / ntohl()
這些函數(shù)用于主機(jī)字節(jié)序和網(wǎng)絡(luò)字節(jié)序之間的轉(zhuǎn)換,分別用于16位和32位整數(shù)的主機(jī)到網(wǎng)絡(luò)字節(jié)序以及網(wǎng)絡(luò)到主機(jī)字節(jié)序的轉(zhuǎn)換。
-
頭文件:#include <arpa/inet.h>
-
函數(shù)原型:
- uint16_t htons(uint16_t hostshort);
- uint32_t htonl(uint32_t hostlong);
- uint16_t ntohs(uint16_t netshort);
- uint32_t ntohl(uint32_t netlong);
這些函數(shù)在實(shí)際網(wǎng)絡(luò)編程中經(jīng)常用于端口號和IP地址等數(shù)據(jù)的轉(zhuǎn)換。
溫馨提示
感謝您對博主文章的關(guān)注與支持!如果您喜歡這篇文章,可以點(diǎn)贊、評論和分享給您的同學(xué),這將對我提供巨大的鼓勵(lì)和支持。另外,我計(jì)劃在未來的更新中持續(xù)探討與本文相關(guān)的內(nèi)容。我會為您帶來更多關(guān)于Linux以及C++編程技術(shù)問題的深入解析、應(yīng)用案例和趣味玩法等。如果感興趣的話可以關(guān)注博主的更新,不要錯(cuò)過任何精彩內(nèi)容!文章來源:http://www.zghlxwxcb.cn/news/detail-838128.html
再次感謝您的支持和關(guān)注。我們期待與您建立更緊密的互動,共同探索Linux、C++、算法和編程的奧秘。祝您生活愉快,排便順暢!文章來源地址http://www.zghlxwxcb.cn/news/detail-838128.html
到了這里,關(guān)于【探索Linux】—— 強(qiáng)大的命令行工具 P.26(網(wǎng)絡(luò)編程套接字基本概念—— socket編程接口 | socket編程接口相關(guān)函數(shù)詳細(xì)介紹 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!