《TCP IP网络编程》第六章
发布人:shili8
发布时间:2025-01-09 11:13
阅读次数:0
**第六章: TCP/IP网络编程**
在前面的章节中,我们已经学习了如何使用UDP进行网络通信。然而,TCP/IP协议栈提供了一种更可靠的连接性服务,即TCP(Transmission Control Protocol)。TCP是面向连接的协议,它能够保证数据包的传递顺序和完整性。
**6.1 TCP概述**
TCP是一种面向连接的协议,它在建立连接之前不会发送任何数据。连接建立后,客户端和服务器之间可以进行双向通信。TCP提供了以下几个关键特性:
* **可靠传输**: TCP能够保证数据包的传递顺序和完整性。
* **连接性**: TCP需要在通信前建立连接,并且在通信结束时关闭连接。
* **流控**: TCP能够控制数据的发送速率,以避免网络拥塞。
**6.2 TCP连接建立**
TCP连接建立过程如下:
1. **客户端和服务器之间建立连接请求**: 客户端使用`connect()`函数向服务器发起连接请求,服务器使用`accept()`函数接收连接请求。
2. **三次握手**: 双方进行三次握手,以确保连接的建立。第一次握手是由客户端发起的,第二次和第三次握手都是由服务器发起的。
**6.3 TCP连接关闭**
TCP连接关闭过程如下:
1. **双方都发送FIN包**: 当通信结束时,双方都会发送FIN包,以通知对方关闭连接。
2. **等待对方确认**: 双方会等待对方确认收到FIN包后再关闭连接。
**6.4 TCP编程示例**
以下是使用TCP进行网络通信的示例代码:
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; // 创建服务器端socket if ((server_fd = socket(AF_INET, SOCK_STREAM,0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // 初始化服务器端地址结构 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); // 绑定服务器端地址和端口号 if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(server_fd,3) == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("服务器正在监听... "); while (1) { socklen_t addrlen = sizeof(client_addr); // 接收客户端连接请求 client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addrlen); if (client_fd == -1) { perror("accept"); continue; } printf("接收到来自客户端的连接请求... "); char buffer[256]; int n; // 接收数据 while ((n = read(client_fd, buffer,255)) >0) { printf("%s", buffer); write(client_fd, "Server received your message! ", strlen("Server received your message! ")); } if (n < 0) { perror("read"); break; } // 关闭连接 close(client_fd); } return0; }
c#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT8080int main() { int client_fd, server_fd; struct sockaddr_in server_addr; // 创建客户端socket if ((client_fd = socket(AF_INET, SOCK_STREAM,0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // 初始化服务器端地址结构 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); // 连接到服务器端 if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); exit(EXIT_FAILURE); } printf("连接到服务器成功... "); char buffer[256]; int n; // 发送数据 while (1) { printf("请输入要发送的信息(或输入exit退出): "); fgets(buffer,255, stdin); if (strcmp(buffer, "exit ") ==0) { break; } write(client_fd, buffer, strlen(buffer)); } // 关闭连接 close(client_fd); return0; }
以上是使用TCP进行网络通信的示例代码。客户端和服务器端都可以发送数据给对方,双方也可以接收对方发来的数据。
**6.5 TCP编程注意事项**
以下是使用TCP进行网络通信时需要注意的事项:
* **连接建立**: 在通信前必须建立连接。
* **连接关闭**: 在通信结束时必须关闭连接。
* **数据包顺序**: TCP会保证数据包的传递顺序。
* **数据完整性**: TCP会保证数据包的完整性。
以上是使用TCP进行网络通信时需要注意的事项。