首页 > 其他分享 >TCP协议的客户端和服务端的多路复用

TCP协议的客户端和服务端的多路复用

时间:2024-06-13 22:02:29浏览次数:21  
标签:addr 多路复用 int TCP readfds sockfd include 服务端 客户端

img

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <sys/time.h>
#include <sys/select.h> 
int main(void)
{
     //1.创建套接字
    int  sockfd  = socket(AF_INET, SOCK_STREAM, 0);
    if( sockfd < 0)
    {
        perror("socket");
        return -1;
    }
     //2.绑定端口和地址
    struct sockaddr_in addr;
    addr.sin_family=AF_INET;
    addr.sin_port = htons(9527);
     //转网络字节序
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    //绑定地址为INADDR_ANY,这个个服务器程序在那个ip地址上运行就绑定那个ip地址    
    int ret = bind(sockfd, (struct sockaddr*)&addr,sizeof(addr));
    if(ret < 0)
    {
        perror("bind");
        return -1;
    }
    //3.监听
    ret  = listen(sockfd, 4);
    if(ret < 0)
    {
        perror("listen");
        return -1;
    }
     //接受连接--accept阻塞
    //接收客户端数据--recv阻塞
     //select多路复用
     fd_set readfds;
     //定义读文件描述符集合
    int  cfds[50]={0};
     //保存所有客户端的套接字
    while(1)
    {
        int maxfd = sockfd;
        //清空集合
        FD_ZERO(&readfds);
        FD_SET(sockfd,&readfds);
          //把sockfd添加到readfds集合中
          //把客户端的套接字也添加到集合中
        for(int i=0; i<50; i++)
        {
           if(cfds[i] != 0)//如果不等于0就说明这个空间存储了套接字 
           {
                FD_SET(cfds[i],&readfds);
                maxfd = maxfd>cfds[i]?maxfd:cfds[i];
            }
        }        //select用监听readfds里面的所有文件描述符,
        //如果某一个或多个描述符有响应就跳出select函数
        ret = select(maxfd+1,&readfds,NULL, NULL, NULL);
        if(ret < 0)
        {
            perror("select");
        }
        //判断是否是sockfd有数据---说明有客户端连接
        if(FD_ISSET(sockfd, &readfds))
        { 
               //接受连接
            int clientfd = accept(sockfd, NULL,NULL);
            if(clientfd < 0)
            {
                perror("accept");
            }            //把客户端套接字保存到cfds数组中
            for(int i=0; i<50; i++)
            {
                if(cfds[i] == 0)//判断放在没有使用的空间中
                {
                     cfds[i] = clientfd;
                     break;
                }
            }
         }        //判断是否是客户端有数据
        for(int i=0; i<50; i++)
        {
            //判断套接字是否存在,并且是否有数据到达
            if(cfds[i] != 0 && FD_ISSET(cfds[i], &readfds))
            { 
                     //接收客户端数据
                char buffer[128]={0};
                int size = recv(cfds[i], buffer, 128, 0);
                if(size<=0)
                {
                    printf("有客户端掉线\n");
                    close(cfds[i]);
                    cfds[i] = 0;
                }
                //把接收到的信息转发给客户端自己
                     size = send(cfds[i],buffer,size,0);

            }
        }
    }
     printf("有客户端连接\n");
    close(sockfd);
 }

标签:addr,多路复用,int,TCP,readfds,sockfd,include,服务端,客户端
From: https://www.cnblogs.com/lwj294/p/18246842

相关文章

  • boost-Asio 基础学习2 --socket 服务端和客户端简单通讯
    已经写了两期文章了!这是第三期现在也到使用asio库实现一些基础的小功能了......
  • 【计算机网络】TCP报文详解
    认识TCP报头其实协议的形式都是一个结构化的数据,TCP协议也不例外。一起来看看TCP协议的报头是怎么样的。以上就是TCP报头,实际上是一个结构化的数据,也就是一个结构体。例如:structtcp_hdr{unsignedintstc_port:16;unsignedintdesc_port:16;unsi......
  • mptcp inside lxc container can't access /proc/sys/net/mptcp_enabled
    https://github.com/multipath-tcp/mptcp/issues/470 VenkateswaranJ commented onMar20,2022 • edited Hi,Ihavecreatedanlxccontainer(ubuntu20.04)withprivilegedmodeandmyhostmachinehasmptcpkernelinstalledubuntu20.04.For......
  • MPTCP is missing from system parameters inside Mininet hosts
    https://github.com/mininet/mininet/issues/1161 Hello,Iamhavingproblemswithcertainsystemparametersnotbeingaccessiblefrom within a Mininet hosteventhoughtheyareaccessiblefromthehostsystem.Afteracleaninstallwiththefollowing:U......
  • tcpdump使用教程
    实用命令实例默认启动tcpdump普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。 监视指定网络接口的数据包tcpdump-ieth1如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。 监视指定主机的数据包......
  • 服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
    哈喽,大家好,我是木头左,物联网搬砖工一名,致力于为大家淘出更多好用的AI工具!背景在现代软件开发中,RESTfulAPI(RepresentationalStateTransferApplicationProgrammingInterface)已经成为一种常用的架构风格。它提供了一种简单、易于理解和实现的方式来构建分布式系统。本文......
  • 泗博Modbus TCP转 PROFINET网关EPN-330
    ​EPN-330作为PROFINET从站,支持与西门子S7-200SMART/300/400/1200/1500全系列PLC以及具有PROFINET主站的系统无缝对接,而ModbusTCP端,可以与ModbusTCP从站设备、主站PLC、DCS系统以及组态软件等进行数据交互。​通过EPN-330,用户可以轻松地将多个ModbusTCP接口的设备连接到PROF......
  • TCP四次挥手全过程详解
    TCP四次挥手全过程有几点需要澄清:1.首先,tcp四次挥手只有主动和被动方之分,没有客户端和服务端的概念2.其次,发送报文段是tcp协议栈的行为,用户态调用close会陷入到内核态3.再者,图中的情况前提是双方程序正常运行,程序在挥手过程中崩溃的情况后面会讲到过程详解(时间顺序)1.......
  • 【网络编程开发】11.IO模型 12.IO多路复用
    11.IO模型什么是IO:IO是Input/Output的缩写,指的是输入和输出。在计算机当中,IO操作通常指将数据从一个设备或文件中读取到计算机内存中,或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。通常用户进程中的一个完整I/O分为两个阶段......
  • IO多路复用
    IO多路复用什么是IO多用复路IO多路复用(Input/OutputMultiplexing)是一种在单个线程中管理多个输入/输出通道的技术。它允许一个线程同时监听多个输入流(例如网络套接字、文件描述符等),并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程。==没有文件句......