用linux C写一个socket本地回环的测试程序包括客户端重连服务器
以下是一个简单的本地回环测试程序,包括客户端重连服务器的功能:
服务器端代码:
#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 8888
#define MAX_CONN 10
int main()
{
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[1024] = {0};
int opt = 1;
// 创建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项,允许地址重用
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
{
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, MAX_CONN) < 0)
{
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Server started, waiting for clients...\n");
while (1)
{
// 接受客户端连接
if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len)) < 0)
{
perror("accept failed");
exit(EXIT_FAILURE);
}
printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
while (1)
{
// 接收客户端消息
memset(buffer, 0, sizeof(buffer));
if (read(client_fd, buffer, sizeof(buffer)) <= 0)
{
printf("Client disconnected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
close(client_fd);
break;
}
printf("Received message from client: %s\n", buffer);
// 发送回复给客户端
if (write(client_fd, buffer, strlen(buffer)) < 0)
{
perror("write failed");
exit(EXIT_FAILURE);
}
}
}
close(server_fd);
return 0;
}
客户端代码:
#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>
#include <errno.h>
#include <signal.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define MAX_RETRIES 3
int main()
{
int client_fd;
struct sockaddr_in server_addr;
char buffer[1024] = {0};
int retries = 0;
// 创建套接字
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置服务器地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0)
{
perror("inet_pton failed");
exit(EXIT_FAILURE);
}
// 连接服务器
while (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
if (retries >= MAX_RETRIES)
{
perror("connect failed");
exit(EXIT_FAILURE);
}
retries++;
printf("Connection failed, retrying in 5 seconds...\n");
sleep(5);
}
printf("Connected to server: %s:%d\n", SERVER_IP, PORT);
while (1)
{
// 发送消息给服务器
printf("Enter message: ");
fgets(buffer, sizeof(buffer), stdin);
buffer[strcspn(buffer, "\n")] = '\0';
if (write(client_fd, buffer, strlen(buffer)) < 0)
{
perror("write failed");
exit(EXIT_FAILURE);
}
// 接收服务器回复
memset(buffer, 0, sizeof(buffer));
if (read(client_fd, buffer, sizeof(buffer)) <= 0)
{
perror("read failed");
exit(EXIT_FAILURE);
}
printf("Received message from server: %s\n", buffer);
}
close(client_fd);
return 0;
}
这个程序简单地实现了一个本地回环测试,即客户端向服务器发送消息,服务器接收到后回复同样的消息给客户端。如果客户端无法连接到服务器,将进行三次重试,每次间隔 5 秒。如果客户端和服务器断开连接,客户端将自动重新连接服务器。
注意:这个程序只是一个简单的示例,没有考虑到并发连接和多线程处理等问题。在实际应用中,请根据需要进行改进
原文地址: https://www.cveoy.top/t/topic/dxil 著作权归作者所有。请勿转载和采集!