佚名通过本文主要向大家介绍了lwiptcp并发服务器,seletc连接不稳定,两个客户端同时方式,server收发一段时间后,再也连接不上等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: lwip tcp并发服务器,seletc连接不稳定,两个客户端同时方式,server收发一段时间后,再也连接不上
描述:
开发平台:ST,M32、FreeRTOS、lwip
参考例程:http://blog.csdn.net/god2469/article/details/8761346#comments
描述:
lwip select并发服务器
lwip tcp并发服务器,seletc连接不稳定,两个客户端同时方式,server收发一段时间后,再也连接不上,希望高手帮我分析下原因,非常感谢!!!开发平台:ST,M32、FreeRTOS、lwip
参考例程:http://blog.csdn.net/god2469/article/details/8761346#comments
#define LISTEN_MAX 5 /* 允许接收的客户端数量最大为5 */
#define RCV_BUF_LEN 1500
static void TCP_ServerSocketThread(void *arg)
{
int server_sockfd, new_cli_sockfd;
int rcd;
int watch_fd_list[LISTEN_MAX]; /* 存放文件描述符值的数组 */
int maxfd; /* 需要监视的最大的文件描述符值 */
fd_set watchfd; /* 存放所有的待检查的文件描述符 */
uint8_t i = 0;
struct timeval tv;
struct sockaddr_in server_addr, client_addr;
socklen_t srvaddr_len, cliaddr_len;
char rcv_buf[1500];
uint32_t rcv_len = 0;
uint32_t snd_len = 0;
for (i=0; i<LISTEN_MAX; i++) {
watch_fd_list[i] = -1;
}
/* 创建IPv4的流式套接字TCP socket */
server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd == -1) {
return ; /* Error */
}
/* 初始化 */
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(36000);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* 绑定socket */
srvaddr_len = (socklen_t)sizeof(server_addr);
if (bind(server_sockfd, (struct sockaddr *)&server_addr, srvaddr_len) == -1) {
return ;
}
/* listen侦听 */
if (listen(server_sockfd, LISTEN_MAX) == -1) {
return ;
}
watch_fd_list[0] = server_sockfd;
maxfd = server_sockfd;
/* 初始化监听集合 */
FD_ZERO(&watchfd);
FD_SET(server_sockfd, &watchfd);
while (1) {
tv.tv_sec = 20;// 5
tv.tv_usec = 0; /* 设置select等待的最大时间为5秒 */
/* 每次都要重新设置集合才能激发事件 */
FD_ZERO(&watchfd);
FD_SET(server_sockfd, &watchfd);
/* 更新集合watchfd */
for (i=0; i<LISTEN_MAX; i++) {
if (watch_fd_list[i] != -1) {
FD_SET(watch_fd_list[i], &watchfd);
}
}
rcd = select(maxfd+1, &watchfd, NULL, NULL, &tv);
if (rcd == -1) {
/* err */
break;
}
else if (rcd == 0) { /* 超时则清理掉所有集合元素并关闭所有与客户端的socket */
FD_ZERO(&watchfd);
for (i=0; i<LISTEN_MAX; i++) {
shutdown(watch_fd_list[i], 2);
watch_fd_list[i] = -1;
}
/* 重新设置监听socket,等待链接 */
FD_CLR(server_sockfd, &watchfd);
FD_SET(server_sockfd, &watchfd);
continue ;
}
else {
/* 检测是否有新连接建立 */
if (FD_ISSET(server_sockfd, &watchfd)) { //new connection
/* 等待客户端连接 */
cliaddr_len = sizeof(client_addr);
new_cli_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &cliaddr_len);
if (new_cli_sockfd < 0) { /* new_cli_sockfd用于和新的client通信 */
return ;
}
/* 更新描述符值数组 */
for (i=0; i<LISTEN_MAX; i++) {
&