使用sscom作为客户端,在Linux下写一个小程序连接客户端,进行收发测试,包括异常重连。
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/wait.h>
#include <linux/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "debug_printf.h"
#include "network.h"
#include "includes.h"
/* Types ------------------------------------------------------------*/
/* Functions ------------------------------------------------------------------*/
#define SERVER_IP "192.168.0.12" // 目标服务器的IP地址
#define SERVER_PORT 8081 // 目标服务器的端口号
#define MAXDATASIZE 1024
#define RECONNECT_INTERVAL 5 // 重新连接的间隔时间(秒)
#define BUFFER_SIZE 1024
int netTest()
{
int sockfd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
ssize_t num_bytes;
bool connected = false;
while(1)
{
if (!connected)
{
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("socket creation failed");
sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
continue;
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0)
{
perror("invalid address/ Address not supported");
close(sockfd);
sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
continue;
}
// 尝试连接到服务器
printf("Attempting to connect to %s:%d...\n", SERVER_IP, SERVER_PORT);
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
perror("connection failed");
close(sockfd);
sleep(RECONNECT_INTERVAL); // 等待一段时间后重试
continue;
}
printf("Connected to %s:%d\n", SERVER_IP, SERVER_PORT);
connected = true; // 设置连接状态为已连接
}
// 客户端与服务器进行通信的循环
while (connected)
{
// 从服务器读取数据
num_bytes = recv(sockfd, buffer, BUFFER_SIZE - 1, 0);
if (num_bytes < 0)
{
if (errno == EINTR)
{
// 被信号中断,继续尝试读取(实际上在这个例子中可能不需要,因为外层有更大的循环)
continue;
}
else
{
perror("recv failed");
// 这里通常意味着连接被服务器关闭了或者出现了其他网络错误
connected = false; // 设置连接状态为未连接,以便外层循环重新连接
break; // 跳出通信循环,进入重新连接逻辑
}
}
else if (num_bytes == 0)
{
// 服务器关闭了连接(正常情况下recv返回0表示连接关闭)
printf("Server closed connection. Will attempt to reconnect...\n");
connected = false; // 设置连接状态为未连接
break; // 跳出通信循环
}
else
{
// 处理接收到的数据
buffer[num_bytes] = '\0'; // 确保字符串以null结尾
printf("Received: %s\n", buffer);
send(sockfd, "Hello, Server!", strlen("Hello, Server!"), 0);
}
}
if (sockfd >= 0)
{
close(sockfd);
sockfd = -1;
}
printf("Disconnected. Will attempt to reconnect...\n");
sleep(RECONNECT_INTERVAL);
}
return 0;
}