linux c 设备通过socket连接服务端,设备开机连接服务器,连接不成功会一直重连,设备连接成功后开启接收和发送线程,如果中途断了,设备也会一直重新连服务器。 给个完整的例子
时间: 2024-12-02 13:17:09 浏览: 2
Socket-master.rar
在Linux C中,要实现这种设备通过socket持续连接服务器并自动重连的功能,你需要创建一个简单的客户端程序,使用socket API以及相关的错误处理和定时重试机制。以下是一个简化的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>
#define MAX_RETRY 5
#define RETRY_INTERVAL 5 * 1000 // 每次重试间隔5秒
// 设定服务器地址和端口
const char* server_ip = "192.168.1.100";
int server_port = 12345;
void connect_server(int sockfd) {
struct addrinfo hints, *res, *p;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if (getaddrinfo(NULL, NULL, &hints, &res) != 0) {
perror("getaddrinfo failed");
exit(EXIT_FAILURE);
}
for (p = res; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
perror("socket failed");
continue;
}
if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
if (errno == EINPROGRESS || errno == EALREADY) { // 非阻塞模式下的连接错误,尝试重试
retry_connect(sockfd);
} else {
perror("connect failed");
close(sockfd);
}
} else {
break; // 连接成功
}
}
freeaddrinfo(res);
}
void retry_connect(int sockfd) {
int retry_count = 0;
struct timeval tv;
do {
sleep(RETRY_INTERVAL / 1000); // 等待一段时间再重试
retry_count++;
connect(sockfd, ...); // 重复连接函数
} while (retry_count <= MAX_RETRY && connect(sockfd, ...) == -1);
}
void start_recv_thread(int sockfd) {
// 创建接收线程并启动
// ...
}
void start_send_thread(int sockfd) {
// 创建发送线程并启动
// ...
}
int main() {
int sockfd = -1;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket failed");
return EXIT_FAILURE;
}
// 尝试连接服务器
connect_server(sockfd);
if (sockfd >= 0) {
printf("Connected to the server.\n");
// 启动接收和发送线程
start_recv_thread(sockfd);
start_send_thread(sockfd);
// 主循环,保持连接活跃
while (1) {
// 省略接收和发送数据的处理...
}
} else {
perror("Failed to connect");
}
return 0;
}
```
这个示例中,`connect_server` 函数负责连接服务器,并在遇到连接失败时进行重试。`start_recv_thread` 和 `start_send_thread` 分别用于创建接收和发送数据的独立线程。请注意,实际应用中需要处理接收和发送数据的部分,这部分省略是为了简化。
阅读全文