首页 > 其他分享 >TCP并发服务器

TCP并发服务器

时间:2024-08-28 22:52:46浏览次数:9  
标签:return int TCP char 并发 sockfd 服务器 sizeof buf

一、整体框架

二、 服务器
单循环服务器:同一时刻,只能处理一个客户端的任务

并发服务器:同一时刻,只能处理多个客户端的任务

UDP 是具备并发性的,是因为UDP是无连接的,所以处理器可以处理过来

TCP实际上是单循环的服务器,只能建立一对一连接,其他人不能再与其建立连接,之前只有一个套接字

现状为了实现并发,我们给每一个连接都给予一个套接字

三、TCP并发务器
3.1、多进程​    

执行流程:

  1. ​socket()
  2. ​bind()
  3. listen()
  4. accept() 
  5. fork()
3.2、多线程
#include<head.h>
 
void *doSth(void *arg)
{
    int connfd = *((int *)arg); 
    while(1)
    {
        char buff[1024] = {0};
        ssize_t size = recv(connfd,buff,sizeof(buff),0);
        if(size <= 0)
        {
            break;
        }
        printf("cli--------->%s\n",buff);
        strcat(buff,"----->ok!");
        send(connfd,buff,strlen(buff),0);
    }
    close(connfd);
}
int conct(const char *ip,unsigned short port)
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd == -1)
    {
        return -1;
    }
    struct sockaddr_in ser;
    ser.sin_family = AF_INET;
    ser.sin_port = htons(port);
    ser.sin_addr.s_addr = inet_addr(ip);
    int ret = bind(sockfd,(struct sockaddr *)&ser,sizeof(ser));
    if(ret == -1)
    {
        perror("fail bind");
        return -1;
    }
    ret = listen(sockfd,120);
    if(ret ==-1)
    {
        return -1;
    }
    return sockfd;
}
int main(int agrc,char *agrv[])
{
    int connfd = 0;
    char buf[1024] = {0};
    int ret;
    pthread_t tid ;
    int sockfd = conct("192.168.1.112",60000);
    if(sockfd == -1)
    {
        return -1;
    }
    while(1)
    {
        connfd = accept(sockfd,NULL,NULL);
        if(-1 == connfd)
        {
            return -1;
        }
        pthread_create(&tid,NULL,doSth,&connfd);
        pthread_detach(tid);
    }
    return 0;
 
}
3.3、IO多路复用

多个读写复用一个进程(在Linux里面就是文件读写)

四、IO模型
4.1、阻塞IO

fgets,scanf,read,recv,getchar(用来实现多个IO同步的效果)

同步:具有先后顺序的效果

#include<head.h>
 
int main(int agrc,char *agrv[])
{
    char buf[1024] = {0};
    mkfifo("./fifo",0666);
    int fd = open("./fifo",O_RDONLY);
   int flag =  fcntl(0,F_GETFL);
    flag = flag & ~O_NONBLOCK;
    fcntl(0,F_SETFL,flag);
    while(1)
    {
        memset(buf,0,sizeof(buf));
        fgets(buf,sizeof(buf),stdin);
        printf("STDIN : %s\n",buf);
        memset(buf,0,sizeof(buf));
        read(fd,buf,sizeof(buf));
        printf("buf = %s\n",buf);
    }
    close(fd);
    return 0;
}

特点:

  • CPU 占有率低
  • 执行效率低
4.2、非阻塞IO

非阻塞就是访问内核,有数据带着数据返回,没有数据也带着返回

特点 

  1. 使用轮询的方式实现
  2. CPU占有率高

 实现:

1、获取原文件描述符的属性

2、增加非阻塞属性

3、设置新属性

#include<head.h>
void handle(int signo)
{
    char buf[1024] = {0};
    fgets(buf,sizeof(buf),stdin);
    printf("STDIN : %s\n",buf);
}
int main(int agrc,char *agrv[])
{
    signal(SIGIO,handle);
    char buf[1024] = {0};
    mkfifo("./fifo",0666);
    int fd = open("./fifo",O_RDONLY);
    int flag = fcntl(0,F_GETFL);
    flag = flag | O_ASYNC;
    fcntl(0,F_SETFL,flag);
    fcntl(0,F_SETOWN,getpid());
    while(1)
    {
        memset(buf,0,sizeof(buf));
        read(fd,buf,sizeof(buf));
        sleep(1);
        printf("%s\n",buf);
    }
    close(fd);
    return 0;
}
4.3、信号驱动IO

实现:(当终端有输入的时候应该会触发,发射信号,才会执行)

1、增加异步属性  O_ASYNC(异步),O_SYNC(同步)

2、关联信号和当前的进程

3、注册信号

特点

1、异步通知io的方式,节省CPU

2、只能检测少量io

2、效率高

标签:return,int,TCP,char,并发,sockfd,服务器,sizeof,buf
From: https://blog.csdn.net/2401_84308772/article/details/141614694

相关文章

  • .NET 8 高并发微服务电商系统实战
    目录前言项目介绍1、核心功能2、优势特点功能介绍技术架构1、后端技术2、前端框架部署架构开发环境项目结构项目效果1、登录页面2、系统首页3、后台管理4、商品管理5、移动端效果项目地址总结最后前言嗨,大家好!推荐一个基于.NET8的高并发微服务电......
  • SQLserver中的事务以及数据并发的问题和事务的四种隔离级别
    SQLserver中的事务在SQLServer中,事务是一组原子性的SQL语句集合,要么全部成功执行,要么全部不执行。事务确保数据库的完整性和一致性,即使在发生错误或系统故障的情况下也是如此。SQLServer支持本地事务和分布式事务。事务的特性(ACID属性)原子性(Atomicity):事务中的所有......
  • JavaEE-TCP协议
    上篇文章介绍了TCP可靠传输主要依靠的确认应答和超时重传机制,超时重传是确认应答的重要补充,还介绍了TCP的连接管理机制。本篇文章补充上一篇文章的TCP十个常用核心机制的其他七个。目录滑动窗口窗口大小流量控制拥塞控制延时应答捎带应答面向字节流异常情况 滑动......
  • 重头开始嵌入式第二十九天(Linux系统编程 网络通信 tcp)
    目录1.常见网络模型1.bs2.p2p3.cs2.网络编程之TCP(传输控制协议)1.TCP模型2.服务器端:1.socket();2、bind();3、listen();4、accept();5、接受函数:/发送函数:6、close()  ===>关闭指定的套接字id;3.客户端:1.connect();2、send()3、客户端信息获取4、客户端的信息bin......
  • socket,TCP/IP的理解
    socket,TCP/IP的理解TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(TransmissionControlProtocol/InternetProtocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何再它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议......
  • 租用服务器都有哪些用途?
    大部分的企业选择开展网络线上业务后,为了方便网络运行的更加顺畅,通常会选择租用或者托管服务器,那企业选择租用服务器都有哪些用途呢?企业选择服务器租用可以进行网站托管服务,将个人或者是企业的网站部署在服务器上,用户就能够通过网络来进行访问,支持多个域名绑定,可以满足不同网......
  • zabbix监控Tomcat服务器操作指引
    作者:乐维社区(forum.lwops.cn)许远Tomcat是一个流行的JavaServlet容器,用于开发和部署JavaWeb应用程序,广泛应用于中小型系统、开发与测试环境、集成环境等场合。Zabbix是一个开源的监控解决方案,广泛用于监控各种网络参数、服务器健康状态以及应用程序的性能,而JMX(JavaManagement......
  • 利用api方式部署流式接口到nginx服务器,api无法流式输出,但localhost和ip可以的问题
    需要在nginx代理中,配置:proxy_cacheoff;#关闭缓存proxy_bufferingoff;#关闭代理缓冲chunked_transfer_encodingon;#开启分块传输编码tcp_nopushon;#开启TCPNOPUSH选项,禁止Nagle算法tcp_nodelayon;#开启TCPNODELAY选项,禁止延迟ACK算法keepalive_t......
  • 协议汇总 TCP、UDP、Http、Socket、Web Scoket、Web Service、WCF、API
    TCP:(1)位于OSI传输层,基于soap(信封)协议;(2)数据格式是xml、Json;(3)是面向连接的,需要先建立连接;(4)TCP协议是一个可靠的传输协议,它可以保证传输的一个正确性,保证我们的不丢包不重复,而且数据是按顺序到达的,保证不丢包(握手需要三次,挥手却要四次);(5)典型的TCP/IP之上的协议有FTP、......
  • 解决云服务器被攻击至黑洞状态的实战指南
    当云服务器遭遇大规模的DDoS攻击时,为了保护网络基础设施和其他客户的服务不受影响,云服务提供商通常会将受到攻击的服务器置于所谓的“黑洞”状态——即完全屏蔽其对外的所有网络连接。本文将详细介绍云服务器被攻击至黑洞状态的原因、识别方法以及解决策略。黑洞状态简介......