高端网站哪个比较好,建设购物网站多少钱,网站服务器放置地怎么填,wordpress页面属性模板怎么添加15. 网络编程 - sys/socket.h 和 netinet/in.h
网络编程在C语言中是通过套接字来实现的#xff0c;套接字提供了进程间通信的端点。C语言的网络编程涉及到创建套接字、绑定地址、监听和接收数据。以下是网络编程的关键概念和基本实现方法。
15.1. 套接字基础…15. 网络编程 - sys/socket.h 和 netinet/in.h
网络编程在C语言中是通过套接字来实现的套接字提供了进程间通信的端点。C语言的网络编程涉及到创建套接字、绑定地址、监听和接收数据。以下是网络编程的关键概念和基本实现方法。
15.1. 套接字基础
15.1.1. 套接字类型与协议
套接字是网络通信的基础它分为不同的类型和协议 套接字类型 流套接字SOCK_STREAM基于TCP协议提供可靠的双向字节流通信。数据报套接字SOCK_DGRAM基于UDP协议无连接面向消息通信时不保证消息顺序和完整性。 协议 TCP传输控制协议提供可靠、有序的字节流服务比如HTTP。UDP用户数据报协议提供较低效能的、不可靠的数据报服务比如DNS查询。
15.1.2. 创建和绑定套接字socket, bind
创建套接字并绑定到指定IP和端口是建立网络服务的基础步骤。 socket 函数用于创建一个新的套接字。 int socket(int domain, int type, int protocol);domain地址族一般为 AF_INETIPv4或 AF_INET6IPv6。type套接字类型如 SOCK_STREAMTCP或 SOCK_DGRAMUDP。protocol通常设为 0自动匹配。 bind 函数将套接字与特定IP地址和端口绑定。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);sockfd由 socket 返回的文件描述符。addrIP地址和端口信息结构体通常为 struct sockaddr_in。addrlen地址结构体的长度。
#include sys/socket.h
#include netinet/in.h
#include stdio.h
#include string.hint main() {int sockfd socket(AF_INET, SOCK_STREAM, 0); // 创建套接字 [1]struct sockaddr_in server_addr;memset(server_addr, 0, sizeof(server_addr)); // 清零server_addr.sin_family AF_INET; // IPv4server_addr.sin_addr.s_addr INADDR_ANY; // 任意可用的接口server_addr.sin_port htons(8080); // 绑定端口8080bind(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)); // 绑定套接字 [2]return 0;
}[1]创建套接字使用 socket 函数创建TCP套接字。IPv4地址AF_INET流套接字类型。[2]绑定套接字bind 函数将创建的套接字绑定到结构体中指定的IP地址和端口上。
15.2. 客户端与服务器模型
15.2.1. TCP 服务器listen, accept
在创建并绑定了套接字后服务器需要监听连接和接受请求。 listen 函数将套接字设置为被动监听状态。 int listen(int sockfd, int backlog);sockfd套接字描述符。backlog等待连接队列的最大长度。 accept 函数从连接队列中取出一个连接请求。 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);sockfd监听中的套接字。addr客户机的IP地址和端口信息。addrlen用户提供的地址结构的大小。
listen(sockfd, 5); // 开始监听 [3]
struct sockaddr_in client_addr;
socklen_t addrlen sizeof(client_addr);
int client_sockfd accept(sockfd, (struct sockaddr*)client_addr, addrlen); // 接受连接 [4][3]监听连接listen 将套接字置为监听状态。[4]接受连接accept 从队列中取出一个连接。
15.2.2. TCP 客户端connect
客户端需要连接到服务端的指定地址和端口。
connect 函数用于连接到服务端。int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);sockfd套接字描述符。addr服务端的 IP 地址和端口信息。addrlen服务器地址信息的结构体大小。
int sockfd socket(AF_INET, SOCK_STREAM, 0); // 创建套接字
struct sockaddr_in server_addr;
memset(server_addr, 0, sizeof(server_addr)); // 清空地址
server_addr.sin_family AF_INET; // IPv4
inet_pton(AF_INET, 127.0.0.1, server_addr.sin_addr); // IP 地址 [5]
server_addr.sin_port htons(8080); // 目标端口
connect(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)); // 发起连接请求 [6][5]设置地址使用 inet_pton 设置目标服务的 IP。[6]发起连接请求connect 连接到指定服务器。
15.2.3. 数据传输send, recv
一旦连接建立服务端和客户端之间就可以通过以下函数进行数据传输。 send 函数用于发送数据。 ssize_t send(int sockfd, const void *buf, size_t len, int flags);sockfd套接字描述符。buf要发送的缓冲区。len缓冲区长度。flags传输标志通常设置为0。 recv 函数用于接收数据。 ssize_t recv(int sockfd, void *buf, size_t len, int flags);用法与 send 类似。
char buffer[1024];
send(client_sockfd, Hello, World!, 13, 0); // 发送信息 [7]
recv(client_sockfd, buffer, sizeof(buffer), 0); // 接收信息 [8][7]发送信息使用 send 传输数据。[8]接收信息使用 recv 接收数据。
15.3. 高级套接字编程
15.3.1. 多路复用select, poll
多路复用允许程序在一个线程中监视多个文件描述符上的事件。 select 函数用于监视多个文件描述符。 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);poll 函数与 select 相似使用 pollfd 结构体数组。 int poll(struct pollfd *fds, nfds_t nfds, int timeout);15.3.2. UDP 套接字编程
UDP 套接字不需要连接可以直接使用 sendto 和 recvfrom。 sendto 函数用于发送UDP数据包。 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);recvfrom 函数用于接收UDP数据包。 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);char udp_buffer[1024];
struct sockaddr_in dest_addr;
memset(dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family AF_INET;
inet_pton(AF_INET, 192.168.1.1, dest_addr.sin_addr);
dest_addr.sin_port htons(9090);
sendto(sockfd, UDP message, 11, 0, (struct sockaddr*)dest_addr, sizeof(dest_addr)); // 发送UDP [9]
recvfrom(sockfd, udp_buffer, sizeof(udp_buffer), 0, NULL, NULL); // 接收UDP [10][9]发送UDP: 使用 sendto 发出数据。[10]接收UDP: 使用 recvfrom 接收UDP数据。
通过这些概念和代码示例你可以开始进行C语言的网络编程创建基本的网络应用程序。无论是客户端还是服务器端处理正确使用这些网络编程API是至关重要的。