【基础】使用socket库进行TCP编程
发布时间: 2024-06-26 02:44:09 阅读量: 62 订阅数: 99
![python网络编程合集](https://media.geeksforgeeks.org/wp-content/uploads/20201021201514/pythonrequests.PNG)
# 1. **2.1 Socket库简介**
**2.1.1 Socket的概念和类型**
Socket是一种应用程序编程接口(API),用于在计算机之间建立网络通信。它提供了一种标准化的方式,允许应用程序通过网络发送和接收数据。
Socket类型有两种:流式套接字和数据报套接字。流式套接字提供可靠、有序的数据传输,而数据报套接字提供无连接、不可靠的数据传输。
# 2. Socket库编程基础
### 2.1 Socket库简介
#### 2.1.1 Socket的概念和类型
Socket是网络编程中用于进程间通信的抽象概念,它代表了一个网络连接的端点。Socket具有以下特性:
- **双向通信:**Socket支持双向数据传输,即数据可以从一个端点发送到另一个端点,反之亦然。
- **独立于传输协议:**Socket独立于底层传输协议,如TCP、UDP等,可以同时支持多种协议。
- **类型:**Socket根据其功能和特性分为以下类型:
- **流式Socket:**提供可靠、有序的数据传输,适合于需要稳定、连续数据流的应用,如文件传输。
- **数据报Socket:**提供不可靠、无序的数据传输,适合于需要快速、轻量级数据传输的应用,如网络游戏。
#### 2.1.2 Socket API的函数调用
Socket API提供了一组函数来创建、管理和使用Socket。常用的函数包括:
- **socket():**创建Socket。
- **bind():**将Socket绑定到一个特定的IP地址和端口号。
- **listen():**使Socket进入监听状态,等待其他Socket的连接。
- **accept():**接受来自其他Socket的连接请求。
- **connect():**主动连接到另一个Socket。
- **send():**向Socket发送数据。
- **recv():**从Socket接收数据。
- **close():**关闭Socket。
### 2.2 Socket通信流程
#### 2.2.1 Socket的创建和绑定
```cpp
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
```
**逻辑分析:**
- `socket()`函数创建了一个流式Socket,并返回Socket描述符`sockfd`。
- `bzero()`函数将`servaddr`结构体中的所有字节清零。
- `servaddr`结构体设置了Socket的属性,包括:
- `sin_family`:IPv4地址族。
- `sin_addr.s_addr`:将主机字节序的IP地址转换为网络字节序,并设置为任意IP地址(`INADDR_ANY`)。
- `sin_port`:将主机字节序的端口号转换为网络字节序。
- `bind()`函数将Socket绑定到指定的IP地址和端口号。
#### 2.2.2 Socket的连接和监听
```cpp
if (listen(sockfd, BACKLOG) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);
int connfd;
while (1) {
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len);
if (connfd < 0) {
perror("accept");
continue;
}
// 处理连接的客户端
}
```
**逻辑分析:**
- `listen()`函数使Socket进入监听状态,并指定最大等待连接数`BACKLOG`。
- `accept()`函数阻塞等待来自客户端的连接请求,并返回连接的客户端Socket描述符`connfd`。
- `cliaddr`结构体存储了客户端Socket的地址信息。
- `len`变量存储了`cliaddr`结构体的长度。
- 循环不断接受客户端连接,并处理连接的客户端。
#### 2.2.3 Socket的数据收发
```cpp
int n;
char buf[BUFSIZE];
while (1) {
n = recv(
```
0
0