客户端与服务器实现

客户端与服务器实现

1. 网络编程基础

1.1 网络编程概述

  • 了解 TCPUDP 协议的区别
  • IPv4IPv6 地址解析
  • Socket 编程模型简介

1.2 Socket 基础

  • 创建 Socket
  • 绑定 (bind) 地址
  • 监听 (listen) 请求
  • 接受 (accept) 客户端连接

2. TCP 服务器实现

2.1 创建基本的 TCP 服务器

  • 创建 Socket
  • 绑定到指定的 IP端口
  • 监听客户端连接
1
2
3
4
5
6
7
8
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8080);

bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_socket, 5);

2.2 处理客户端连接

  • 使用 accept 接受连接
  • 创建一个新的 Socket 与客户端通信
1
2
3
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_len);

2.3 发送和接收数据

  • 使用 send()recv() 函数进行数据传输
1
2
3
char buffer[1024];
recv(client_socket, buffer, sizeof(buffer), 0);
send(client_socket, "Hello Client", strlen("Hello Client"), 0);

2.4 关闭连接

  • 使用 close() 函数关闭 Socket
1
close(client_socket);

3. TCP 客户端实现

3.1 创建基本的 TCP 客户端

  • 创建 Socket
  • 连接到服务器
1
2
3
4
5
6
7
int client_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));

3.2 发送和接收数据

  • 使用 send()recv() 函数进行数据传输
1
2
3
send(client_socket, "Hello Server", strlen("Hello Server"), 0);
char buffer[1024];
recv(client_socket, buffer, sizeof(buffer), 0);

3.3 关闭连接

  • 使用 close() 函数关闭 Socket
1
close(client_socket);

4. 完整案例:简单的回声服务器

4.1 服务器代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
char buffer[1024];

server_socket = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);

bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_socket, 5);

while (1) {
socklen_t addr_len = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_len);
recv(client_socket, buffer, sizeof(buffer), 0);
send(client_socket, buffer, strlen(buffer), 0); // 回显操作
close(client_socket);
}

close(server_socket);
return 0;
}

4.2 客户端代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
int client_socket;
struct sockaddr_in server_addr;
char *msg = "Hello, Server!";
char buffer[1024];

client_socket = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);

connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr));
send(client_socket, msg, strlen(msg), 0);
recv(client_socket, buffer, sizeof(buffer), 0);
printf("Received from server: %s\n", buffer);

close(client_socket);
return 0;
}

5. 运行与测试

  • 编译服务器和客户端
  • 先运行服务器,再运行客户端
  • 测试回显功能

6. 进阶课題

  • 多线程/进程并发服务器实现
  • 处理错误和异常
  • 数据加密与安全传输

总结

通过上述步骤,您可以掌握 C 语言中的基本 Socket 网络编程以及简单的客户端与服务器的实现。将这些知识运用在实际项目中将有助于您进一步深化对网络编程的理解。

客户端与服务器实现

https://zglg.work/c-language-one/33/

作者

AI教程网

发布于

2024-08-08

更新于

2024-08-10

许可协议