【进阶】高级网络编程:socket编程
发布时间: 2024-06-27 16:14:03 阅读量: 6 订阅数: 23
![【进阶】高级网络编程:socket编程](https://img-blog.csdnimg.cn/img_convert/aa7d608381ebeaec7825ce2e29151f5b.png)
# 1. Socket编程基础**
Socket编程是一种用于计算机之间网络通信的编程范式。它允许应用程序通过网络连接交换数据,无论应用程序位于同一计算机还是不同的计算机上。
Socket编程的基础是套接字(socket),它是一个端点,用于在两个应用程序之间建立通信通道。套接字由一个IP地址和一个端口号组成,它标识网络上特定应用程序的特定实例。
要进行Socket编程,需要创建套接字,绑定它到特定的IP地址和端口号,然后监听传入连接或主动连接到远程套接字。一旦连接建立,应用程序就可以通过套接字发送和接收数据。
# 2. Socket编程实践
### 2.1 TCP服务器端编程
#### 2.1.1 服务器端socket创建和绑定
**创建socket**
```cpp
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
```
* `AF_INET`:IPv4地址族
* `SOCK_STREAM`:TCP协议类型
* `0`:默认协议
**绑定socket**
```cpp
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
int bind_result = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (bind_result == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
```
* `server_addr`:服务器地址结构体
* `htons(PORT)`:将端口号转换为网络字节序
* `INADDR_ANY`:绑定到所有可用的网络接口
#### 2.1.2 服务器端监听和接收客户端连接
**监听socket**
```cpp
int listen_result = listen(server_socket, BACKLOG);
if (listen_result == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
```
* `BACKLOG`:监听队列的最大长度
**接收客户端连接**
```cpp
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_socket == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
```
* `client_addr`:客户端地址结构体
* `client_addr_len`:客户端地址结构体长度
* `accept`:接受客户端连接,返回新的socket描述符
### 2.2 TCP客户端端编程
#### 2.2.1 客户端端socket创建和连接
**创建socket**
```cpp
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
```
**连接到服务器**
```cpp
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
int connect_result = connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (connect_result == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
```
* `SERVER_IP`:服务器IP地址
* `inet_addr`:将字符串IP地址转换为网络字节序
#### 2.2.2 客户端端数据发送和接收
**发送数据**
```cpp
int send_result = send(client_socket, data, strlen(data), 0);
if (send_result == -1) {
perror("send");
exit(EXIT_FAILURE);
}
```
* `data`:要发送的数据
* `strlen(data)`:数据长度
**接收数据**
```cpp
char buffer[BUFFER_SIZE];
int recv_result = recv(client_socket, buffer, BUFFER_SIZE, 0);
if (recv_result == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
```
* `BUFFER_SIZE`:接收缓冲区大小
* `buffer`:接收数据的缓冲区
### 2.3 UDP编程
#### 2.3.1 UDP socket创建和绑定
**创建socket**
```cpp
int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (udp_socket == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
```
* `
0
0