lwip tcp并发服务器,seletc连接不稳定,两个客户端同时方式,server收发一段时间后,再也连接不上

阳光灿烂的日子czha 2016-11-18 12:29:47
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++) {
if (watch_fd_list[i] == -1) {
watch_fd_list[i] = new_cli_sockfd;
break;
}
}

/* 更新描述符集合 更新最大描述符值 */
FD_SET(new_cli_sockfd, &watchfd);
if (maxfd < new_cli_sockfd) {
maxfd = new_cli_sockfd;
}

continue;
}
/* 已有连接的数据通信 */
else {
/* 遍历每个设置过的集合元素 */
for (i=0; i<LISTEN_MAX; i++) { //data
if (watch_fd_list[i] == -1) {
continue;
}
if (!FD_ISSET(watch_fd_list[i], &watchfd)) {
continue;
}

/* 接收 */
rcv_len = recv(watch_fd_list[i], rcv_buf, RCV_BUF_LEN, 0);
if (rcv_len < 0) {
/* err */
}
rcv_buf[rcv_len] = 0;

/* 发送接收到到数据 */
snd_len = send(watch_fd_list[i], rcv_buf, strlen(rcv_buf), 0);
if (snd_len < 0) {
/* err */
}

//close(watch_fd_list[i]);

shutdown(watch_fd_list[i], 2);
watch_fd_list[i] = -1;
FD_CLR(watch_fd_list[i], &watchfd);
}
}
#if 0
for (i=0; i<LISTEN_MAX+1; i++) {
if (watch_fd_list[i] != 0) {
close(watch_fd_list[i]);
}
}
#endif
// break; /* 加上break后收发一次 程序就崩溃?????? */
}
}
}


#define TCPECHO_THREAD_PRIO (TCPIP_THREAD_PRIO + 1)

void CreateTCPEchoServer(void)
{
sys_thread_new("TCP_EchoServerThread",
TCP_ServerSocketThread, //TCP_EchoServerThread,
NULL,
1000, //DEFAULT_THREAD_STACKSIZE
TCPECHO_THREAD_PRIO);
...全文
993 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzhuflyer 2019-01-04
  • 打赏
  • 举报
回复
你好,将break改为continue试试,程序可以运行记得给分哦。

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧