实现linux下的基于C语言的一个严谨的TCP客户端与服务端的通信,支持两端相互推送指定长度数据(如1MB或10MB),支持慢发送usleep函数的调用并显示单位毫秒,客户端可以循环调用
时间: 2024-02-23 07:00:03 浏览: 59
好的,这是一个比较复杂的问题,需要分步骤来实现。我将按照以下步骤来回答你的问题:
1. 创建TCP客户端和服务端
2. 实现数据的发送和接收
3. 添加usleep函数的调用
4. 显示发送时间
下面是每个步骤的详细说明:
1. 创建TCP客户端和服务端
要创建TCP客户端和服务端,我们需要使用socket函数。服务端需要调用bind函数来绑定一个IP地址和端口号,然后调用listen函数来监听客户端的连接请求。客户端需要调用connect函数来连接服务端。以下是示例代码:
服务端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
int addr_len = sizeof(struct sockaddr_in);
char buffer[1024];
// create socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("socket");
exit(1);
}
// bind address and port
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(12345);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(1);
}
// listen for connections
if (listen(server_fd, 5) == -1) {
perror("listen");
exit(1);
}
// accept connection
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, (socklen_t *)&addr_len);
if (client_fd == -1) {
perror("accept");
exit(1);
}
// receive data
int len = recv(client_fd, buffer, sizeof(buffer), 0);
if (len == -1) {
perror("recv");
exit(1);
}
// print data
printf("Received %d bytes: %.*s\n", len, len, buffer);
// close sockets
close(client_fd);
close(server_fd);
return 0;
}
```
客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main() {
int client_fd;
struct sockaddr_in server_addr;
char *message = "Hello, world!";
// create socket
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
perror("socket");
exit(1);
}
// connect to server
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(12345);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
exit(1);
}
// send data
int len = send(client_fd, message, strlen(message), 0);
if (len == -1) {
perror("send");
exit(1);
}
// close socket
close(client_fd);
return 0;
}
```
2. 实现数据的发送和接收
在客户端和服务端建立连接后,我们可以使用send和recv函数来发送和接收数据。以下是示例代码:
服务端:
```c
// receive data
int len = recv(client_fd, buffer, sizeof(buffer), 0);
if (len == -1) {
perror("recv");
exit(1);
}
// print data
printf("Received %d bytes: %.*s\n", len, len, buffer);
```
客户端:
```c
// send data
int len = send(client_fd, message, strlen(message), 0);
if (len == -1) {
perror("send");
exit(1);
}
```
3. 添加usleep函数的调用
如果需要添加usleep函数的调用,可以在发送数据前加上usleep函数。以下是示例代码:
客户端:
```c
// send data with usleep
for (int i = 0; i < 10; i++) {
int len = send(client_fd, message, strlen(message), 0);
if (len == -1) {
perror("send");
exit(1);
}
usleep(1000);
}
```
4. 显示发送时间
如果需要显示发送时间,可以使用gettimeofday函数来获取当前时间。以下是示例代码:
客户端:
```c
struct timeval start, end;
gettimeofday(&start, NULL);
// send data with usleep
for (int i = 0; i < 10; i++) {
int len = send(client_fd, message, strlen(message), 0);
if (len == -1) {
perror("send");
exit(1);
}
usleep(1000);
}
gettimeofday(&end, NULL);
long seconds = end.tv_sec - start.tv_sec;
long microseconds = end.tv_usec - start.tv_usec;
double elapsed = seconds + microseconds / 1000000.0;
printf("Time taken: %.6f seconds\n", elapsed);
```
以上就是实现linux下的基于C语言的一个严谨的TCP客户端与服务端的通信的步骤,希望能对你有所帮助!
阅读全文