《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进行网络通信时需要注意的事项。

