C语言利用LWIP的SOCKET套接字编写3个客户端的代码,要求无论服务端先开启还是客户端先开启,都可以连接并且无延迟,需要保活机制
时间: 2023-11-12 14:09:39 浏览: 97
C语言实现socket服务端和客户端
4星 · 用户满意度95%
以下是一个使用LWIP库编写的C语言TCP客户端代码示例,其中包括了保活机制:
```c
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include "lwip/netdb.h"
#define SERVER_IP "192.168.0.1"
#define SERVER_PORT 12345
int main(void) {
int sockfd;
struct sockaddr_in server_addr;
char buf[1024];
int len;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket");
return -1;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
if (connect(sockfd, (struct sockaddr *)&server_addr,
sizeof(server_addr)) < 0) {
perror("connect");
return -1;
}
// 设置TCP保活机制
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数。如果第1次探测包就收到响应了,则后2次的不再发。
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
while (1) {
printf("Input message to send: ");
fgets(buf, sizeof(buf), stdin);
len = send(sockfd, buf, strlen(buf), 0);
if (len < 0) {
perror("send");
break;
}
memset(buf, 0, sizeof(buf));
len = recv(sockfd, buf, sizeof(buf), 0);
if (len < 0) {
perror("recv");
break;
}
printf("Received message: %s\n", buf);
}
close(sockfd);
return 0;
}
```
这个客户端代码使用了LWIP库提供的socket函数进行套接字操作,连接到指定的服务器IP和端口。在连接建立后,通过设置setsockopt函数来开启TCP保活机制,确保连接不会因为长时间未通信而被关闭。然后进入循环,用户可以输入要发送的消息,程序将其发送给服务器并等待接收对方的回复。循环一直执行直到用户输入exit或者发生错误。最后关闭套接字并退出程序。
阅读全文