打印

求助:TCP SERVER如何同两个CLIENT端口连接?

[复制链接]
1934|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
QIUHF71|  楼主 | 2015-1-4 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位一个问题:
我在开发一个项目,基于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)同时建立连接,
进行数据收发,请问如何实现?折腾了好几天,依旧没有结果。:'(

相关帖子

沙发
zhusizhan| | 2015-1-5 11:04 | 只看该作者
你贴的代码应该仅仅用于监听端口
在发现有客户端连接时,再建立一个SOCKET用于和该连接通信
之后监听进程继续监听端口

使用特权

评论回复
板凳
QIUHF71|  楼主 | 2015-1-5 15:56 | 只看该作者
抱歉,我没有理解你的意思。上述代码我是这样理解的:建立了一个 xServerSocket.s用于监听端口,如果有客户端连接,建立了xServerSocket.c用于通信,同时xServerSocket.s依然有效,继续在监听。不知这样理解是否正确?

使用特权

评论回复
地板
sasinop| | 2015-1-12 09:52 | 只看该作者
打个比方
如打电话
监听端口,像程控交换机,你 请求,  他帮你 转到你讲话的人那,
然后
继续监听其他通信请求

使用特权

评论回复
5
zhusizhan| | 2015-1-13 14:23 | 只看该作者
QIUHF71 发表于 2015-1-5 15:56
抱歉,我没有理解你的意思。上述代码我是这样理解的:建立了一个 xServerSocket.s用于监听端口,如果有客户 ...

就是这个意思

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝