搜索
bottom↓
回复: 4

ucos lwip socket TCP服务器数据传输问题

[复制链接]

出0入0汤圆

发表于 2011-7-26 17:23:03 | 显示全部楼层 |阅读模式
我是移植了lwip到UCOS上面,对RAW API控制是没有问题,我想建立TCP服务器,支持多台设备连接,一直没有找到好的办法,我想到了SOCKET API中的select函数。下面是我建立的一个任务TCP 服务器任务。
问题:可以偶尔连接,数据不能通信,但是PING 是通的。
原因:是加入了select,因为我在没有select下,可以一台设备连接,而且通信很好。大家帮我看看。
static void TCP_Multil_Test(void *parg)
{
   char recv_data[50]; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */
   u32_t sin_size;
   int listener, connected, bytes_received;
   struct sockaddr_in server_addr, client_addr;
   //bool stop = FALSE; /* 停止标志 */
   
   fd_set master; /* master file descriptor */
   fd_set read_fds; /* temp file descriptor list for select */
   int fdmax; /* maximum file descriptor number */
   int i, j;

   FD_ZERO(&master);    /* clear the master and temp sets */
   FD_ZERO(&read_fds);
   
   /* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */
   if ((listener = socket(AF_INET, SOCK_STREAM, 0)) == -1)
   {
       return;
   }

   /* 初始化服务端地址 */
   server_addr.sin_family = AF_INET;
   server_addr.sin_port = htons(4003); /* 服务端工作的端口 */
   server_addr.sin_addr.s_addr = INADDR_ANY;
   memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));

   /* 绑定socket到服务端地址 */
   if (bind(listener, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
   {
       return;
   }

   /* 在socket上进行监听 */
   if (listen(listener, 10) == -1)
   {
       return;
   }

   /* add the listener to the master set */
   FD_SET(listener, &master);

   /* keep track of the biggest file descriptor */
   fdmax = listener;

        while(1)
   {
       read_fds = master; /* copy it */
       /* block & waiting for connect or received data */
       if(lwip_select(fdmax+1, &read_fds, NULL, NULL, NULL) == 0)
       {
           continue;
       }
       //UARTSend((unsigned char *)"Get select\n", 12);
       for(i = 0; i <= fdmax; i++)
       {
           if(FD_ISSET(i, &read_fds))
           {
                       // we got one.
               if(i == listener)
               {   /* handle new connections */
                   sin_size = sizeof(struct sockaddr_in);
                   /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */
                   connected = accept(i, (struct sockaddr *)&client_addr, &sin_size);
                   /* 返回的是连接成功的socket */
                   if(connected == -1)
                                            continue;
                       //printf("accept connect error.\n");
                   else
                   {
                       FD_SET(connected, &master); /* add to master set */
                       if(connected  > fdmax) /* keep track of the max */
                           fdmax = connected;
                                           UARTSend((unsigned char *)"Get Connet..\n", 14);
                       /* 接受返回的client_addr指向了客户端的地址信息 */
//                       printf("I got a connection from (%s , %d)\n",
//                              inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
                   }
               }
               else
               {   // handle data from a client
                   bytes_received = recv(i, recv_data, 50, 0);
                  
                   if (bytes_received <= 0)
                   {
                       /* 接收失败,关闭这个connected socket */
                       lwip_close(i);
                       FD_CLR(i, &master); /* remove from master set */
                       continue;
                   }
                                   send(i, recv_data, bytes_received, 0);
               } // End of Handle data from client
           } // End of new incoming connection
       } // end of loop through file descriptors
   } // end of while(stop != TRUE)       
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-7-26 22:32:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-8-8 10:24:22 | 显示全部楼层
兄弟你好,你的问题解决了吗?我最近也在做ucos + lwip 也是使用select函数实现多客户端的并发,建立连接后比较稳定,但是有一个问题,只能和两个客户端连接,第3个连接请求到达的时候就不响应了,能不能帮我分析一下。

出0入0汤圆

发表于 2012-9-22 09:46:52 | 显示全部楼层
楼主问题解决了吗?能不能把源码给我们看一下啊,谢谢啦

出0入0汤圆

发表于 2018-4-23 21:33:24 | 显示全部楼层
楼主解决了 可以分享一下处理方式吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 21:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表