TCP SERVER如何建立两个连接?

2019-03-23 17:50发布

请教各位一个问题:
我在开发一个项目,基于STM32F107平台,加载FREERTOS及LWIP协议栈,目前实现了TCP SERVER功能,代码如下:
void TCPServer( void *arg )
{
int optval = 1;
u32_t len;
struct sockaddr_in Server_Local_addr,Client_Remote_addr;
fd_set fdsr;
struct timeval tv;
uint8_t i;

tv.tv_sec = 3;
tv.tv_usec = 0;

(void)arg;
xServerSocket.s = lwip_socket(AF_INET,SOCK_STREAM,0);
if(xServerSocket.s == -1 )
{
  return;
}
optval = 1;
  
lwip_setsockopt(xServerSocket.s,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval));
Server_Local_addr.sin_family = AF_INET;
Server_Local_addr.sin_port = htons(8800);
Server_Local_addr.sin_len = sizeof(Server_Local_addr);
Server_Local_addr.sin_addr.s_addr = INADDR_ANY;

if (lwip_bind(xServerSocket.s, (struct sockaddr *) &Server_Local_addr, sizeof(Server_Local_addr)) < 0)
{
  return ;
}
if (lwip_listen(xServerSocket.s, 10) == -1)
{
  return;
}
while(1)
{
  len = sizeof(Client_Remote_addr);
  xServerSocket.c = lwip_accept(xServerSocket.s, (struct sockaddr *)&Client_Remote_addr, &len);
  if(xServerSocket.c == -1)
  {
   lwip_close(xServerSocket.c);
   continue;
  }
  int ret;
  while(1)
  {
   FD_ZERO(&fdsr);
   FD_SET(xServerSocket.c, &fdsr);
   ret = lwip_select(xServerSocket.c+1, &fdsr, NULL, 0, &tv);
   if(ret > 0)
   {
    if (FD_ISSET(xServerSocket.c, &fdsr))
    {
     int datalen;
     datalen = lwip_recv(xServerSocket.c,ServerRevBuf,NET_BUF_SIZE,0);
     if(datalen > 0)
     {
      //此处处理接收到的数据,省略
      ........................
     }
     else
     {
      lwip_close(xServerSocket.c);
      xServerSocket.c = -1;
      break;
     }
    }
   }
   else if(ret < 0)
   {
    lwip_close(xServerSocket.c);
    xServerSocket.c = -1;
    break;
   }
  }
  lwip_close(xServerSocket.c);
  xServerSocket.c = -1;
}
// vTaskDelete( NULL );
}
目前的问题是,TCP SERVER的端口8800,需要和测试电脑的两个CLIENT端口(例如:30000、30001)同时建立连接,
进行数据收发,请问如何实现?折腾了好几天,依旧没有结果。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
Qiuhf
1楼-- · 2019-03-24 00:18
/ 在线等待大侠回复
Li_Lei
2楼-- · 2019-03-24 04:25
 精彩回答 2  元偷偷看……
Study_Stellaris
3楼-- · 2019-03-24 09:41
看看 lwipopts.h 这个文件的配置,看允许建立的连接数,打开调试接口看看连接的执行路径,好好研究一下,TCP 连接建立的过程和状态机。
Qiuhf
4楼-- · 2019-03-24 13:39
huo_hu 发表于 2015-1-4 19:43
帮顶啦


谢啦!

Qiuhf
5楼-- · 2019-03-24 16:29
 精彩回答 2  元偷偷看……
Study_Stellaris
6楼-- · 2019-03-24 21:25
本帖最后由 Study_Stellaris 于 2015-1-5 15:53 编辑
Qiuhf 发表于 2015-1-5 15:30
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application  sends a lot of data out of ROM (or other static memory), this
   should be set high. */
#define MEMP_NUM_PBUF           100
/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One  per active UDP "connection". */
#define MEMP_NUM_UDP_PCB        6
/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP  connections. */
#define MEMP_NUM_TCP_PCB        10
/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP  connections. */
#define MEMP_NUM_TCP_PCB_LISTEN 5
/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP  segments. */
#define MEMP_NUM_TCP_SEG        20
/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active  timeouts. */
#define MEMP_NUM_SYS_TIMEOUT    10


这些参数我看了,应该是没有问题。目前的状况是可以正常建立两个连接,但是只有第一个连接可以正常收发数据,第二个连接需要断开第一个连接之后才能正常收发。一个人在这瞎琢磨,周围没有别人可以商量,只能慢慢分析。还望不吝赐教。谢谢!

理解,不过我有好长一段时间不用 lwip了,所以好多忘记了。我不太了解你是如何测试的,会不会是客户端的问题呢?
如果可以建立连接,但不能进行收发,可以看一下到底是不能收呢,还是不能发,找找阻塞的原因。
另外关于 TCP 的内容,可以看看这篇文章,希望对你有帮助。http://coolshell.cn/articles/11564.html




一周热门 更多>