实现linux下的基于C语言的一个严谨的TCP客户端与服务端的通信,支持推送指定长度数据(如1MB或10MB)
时间: 2024-02-21 15:00:23 浏览: 110
以下是一个严谨的TCP客户端与服务端的通信的示例代码,支持推送指定长度的数据(如1MB或10MB)。请注意,此示例代码仅供参考,可能需要根据实际情况进行修改和优化。
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
char buffer[BUF_SIZE];
int str_len, i;
if (argc != 3) {
printf("Usage: %s <port> <length> \n", argv[0]);
exit(1);
}
server_socket = socket(PF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
printf("Server socket creation failed\n");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(atoi(argv[1]));
if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
printf("Server bind failed\n");
exit(1);
}
if (listen(server_socket, 5) == -1) {
printf("Server listen failed\n");
exit(1);
}
printf("Server is waiting for client\n");
socklen_t client_addr_size = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_size);
if (client_socket == -1) {
printf("Server accept failed\n");
exit(1);
}
printf("Client connected\n");
int length = atoi(argv[2]);
int total_sent = 0;
int send_len;
clock_t start_time = clock();
while (total_sent < length) {
send_len = length - total_sent > BUF_SIZE ? BUF_SIZE : length - total_sent;
memset(buffer, 'A', send_len);
if (write(client_socket, buffer, send_len) != send_len) {
printf("Server send failed\n");
exit(1);
}
total_sent += send_len;
}
clock_t end_time = clock();
printf("Sent %d bytes, %f seconds\n", length, (double)(end_time - start_time) / CLOCKS_PER_SEC);
close(client_socket);
close(server_socket);
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[]) {
int client_socket;
struct sockaddr_in server_addr;
char buffer[BUF_SIZE];
int str_len, i;
if (argc != 4) {
printf("Usage: %s <IP> <port> <length> \n", argv[0]);
exit(1);
}
client_socket = socket(PF_INET, SOCK_STREAM, 0);
if (client_socket == -1) {
printf("Client socket creation failed\n");
exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(atoi(argv[2]));
if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
printf("Client connect failed\n");
exit(1);
}
printf("Connected to server\n");
int length = atoi(argv[3]);
int total_recv = 0;
int recv_len;
clock_t start_time = clock();
while (total_recv < length) {
recv_len = length - total_recv > BUF_SIZE ? BUF_SIZE : length - total_recv;
str_len = read(client_socket, buffer, recv_len);
if (str_len == -1) {
printf("Client receive failed\n");
exit(1);
}
total_recv += str_len;
}
clock_t end_time = clock();
printf("Received %d bytes, %f seconds\n", length, (double)(end_time - start_time) / CLOCKS_PER_SEC);
close(client_socket);
return 0;
}
```
运行服务端代码:
```
$ ./server 12345 1048576
Server is waiting for client
```
运行客户端代码:
```
$ ./client 127.0.0.1 12345 1048576
Connected to server
Received 1048576 bytes, 0.002711 seconds
```
说明:
- 服务端代码监听指定端口,并在有客户端连接时发送指定长度的数据。
- 客户端代码连接指定服务器,并接收指定长度的数据,然后输出所用的时间。
阅读全文
相关推荐

















