4.Linux平台下利用系统接口函数实现Socket客户端服务器端通信程序;要求:利用TCP协议通信; 可实现大文件(20M)传输(自备测试文件); 可实现自定义协议格式的数据传输,且双向能够解析数据。
时间: 2024-04-16 09:29:00 浏览: 26
在Linux平台下,可以使用系统接口函数来实Socket客户端和服务器端的通信程序。以下是一个基本的示例代码,实现了TCP协议通信、大文件传输和自定义协议格式的数据传输。
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
#define BUFFER_SIZE 1024
void handle_client(int client_socket) {
char buffer[BUFFER_SIZE];
ssize_t num_bytes;
// 接收客户端发送的数据
num_bytes = recv(client_socket, buffer, BUFFER_SIZE, 0);
if (num_bytes == -1) {
perror("recv");
exit(1);
}
// 在这里可以解析接收到的数据,并根据自定义协议进行处理
// 发送数据给客户端
const char *response = "Hello from server!";
num_bytes = send(client_socket, response, strlen(response), 0);
if (num_bytes == -1) {
perror("send");
exit(1);
}
close(client_socket);
}
int main() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
socklen_t client_addrlen = sizeof(client_address);
// 创建服务器端的socket
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("socket");
exit(1);
}
// 设置服务器地址结构
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT);
// 将socket绑定到服务器地址
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {
perror("bind");
exit(1);
}
// 开始监听客户端连接
if (listen(server_socket, 5) == -1) {
perror("listen");
exit(1);
}
printf("Server listening on port %d\n", PORT);
while (1) {
// 接受客户端连接
client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_addrlen);
if (client_socket == -1) {
perror("accept");
exit(1);
}
handle_client(client_socket);
}
close(server_socket);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8080
#define BUFFER_SIZE 1024
void send_file(int client_socket, const char *filename) {
FILE *file = fopen(filename, "rb");
if (!file) {
perror("fopen");
exit(1);
}
char buffer[BUFFER_SIZE];
ssize_t num_bytes;
// 从文件中读取数据并发送给服务器
while ((num_bytes = fread(buffer, 1, BUFFER_SIZE, file)) > 0) {
if (send(client_socket, buffer, num_bytes, 0) == -1) {
perror("send");
exit(1);
}
}
fclose(file);
}
int main() {
int client_socket;
struct sockaddr_in server_address;
// 创建客户端的socket
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
perror("socket");
exit(1);
}
// 设置服务器地址结构
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
if (inet_pton(AF_INET, SERVER_IP, &(server_address.sin_addr)) <= 0) {
perror("inet_pton");
exit(1);
}
// 连接到服务器
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) == -1) {
perror("connect");
exit(1);
}
printf("Connected to server\n");
// 发送大文件给服务器
send_file(client_socket, "test.txt");
// 接收服务器发送的数据
char buffer[BUFFER_SIZE];
ssize_t num_bytes = recv(client_socket, buffer, BUFFER_SIZE, 0);
if (num_bytes == -1) {
perror("recv");
exit(1);
}
// 在这里可以解析接收到的数据,并根据自定义协议进行处理
printf("Server says: %.*s\n", (int)num_bytes, buffer);
close(client_socket);
return 0;
}
```
在上述代码中,服务器端和客户端分别使用了`socket`、`bind`、`listen`、`accept`、`connect`、`send`和`recv`等系统接口函数来实现TCP协议的通信。服务器端在接收到客户端发送的数据后,可以根据自定义协议进行处理,并发送响应给客户端。客户端可以发送大文件给服务器,并接收服务器发送的数据。
请注意,以上代码仅为示例,可能需要根据具体需求进行适当的修改和调整。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)