在上一篇文章中,我们分享了嵌入式开发中TCP通信常用接口的使用封装。在示例中,我们只实现了简单的一对一通信。
然而,在实际开发中,TCP服务器需要支持与多个客户端同时进行通信。因此,本篇文章将分享实现一对多通信的方法,即TCP服务器并发处理。
实现TCP服务器并发处理的方式有多种,包括多进程和多线程。
由于多进程方式的开销较大,并不常用。因此,本篇文章将重点介绍多线程的方法来实现TCP服务器的并发处理。
简单的demo
tcp_server.c:
*左右滑动查看全部代码>>>*
#include 主线程,监听客户端连接;cli_data_proce_thread_tid线程处理客户端数据。下面我们创建4个client与该server进行连接。
首先,需要注意的是,我们创建tcp_server的方式为:
左右滑动查看全部代码>>>
int server_fd = tcp_init(NULL, 4321);
int tcp_init(const char* ip, int port)
{
    int optval = 1; 
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd "socket");
        return -1;
    }
    /* 解除端口占用 */
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) "setsockopt\n");
  return -1;
 }
    struct sockaddr_in server_addr;
    bzero(&server_addr, sizeof(struct sockaddr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    if (NULL == ip)
    {
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    }
    else
    {
        server_addr.sin_addr.s_addr = inet_addr(ip); 
    }
    if (bind(server_fd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr)) "bind");
        close(server_fd);
        return -1;
    }
    if(listen(server_fd, MAX_CONNECT_NUM) "listen");
        close(server_fd);
        return -1;
    }
    return server_fd;
}
我们使用INADDR_ANY来创建server。
“
INADDR_ANY:表示不确定地址,或所有地址、任意地址。也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。
”
我们本机所有网卡的IP:
192.168.1.107
127.0.0.1
我们的本机上的client(client的代码见上一节)连接这两个IP都可以连上server。
下面使用我们本机上两个client连接server并进行数据交互:
Windows的网络助手链接server:
我们再开一个Ubuntu虚拟机,上面的client连接该server:
以上就是本次demo演示的server同时与4个client通信的小实验。
本次的完整demo代码可在本公众号后台回复关键词:**client1234** ,进行获取。
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

 
		





 微信扫一扫打赏
			    	微信扫一扫打赏
			     支付宝扫一扫打赏
			    	支付宝扫一扫打赏	
			    

.png) 
		        