首页 > 其他分享 >【TCP】并发服务器<线程>

【TCP】并发服务器<线程>

时间:2023-12-14 21:23:28浏览次数:33  
标签:addr int TCP 并发 new sockfd 服务器 include buf

// 并发服务器-线程
#include <stdio.h>
#include <strings.h>    //bzero
#include <unistd.h>     //close
#include <sys/socket.h> //socket
#include <netinet/in.h> //struct sockaddr_in
#include <arpa/inet.h>  //inet_addr
#include <string.h>
#include <pthread.h>

void *recv_send_fun(void *arg)
{
    int sockfd_new = *((int *)arg);
    char buf[1024] = "";
    while (1)
    {
        bzero(buf, sizeof(buf));
        recv(sockfd_new, buf, sizeof(buf), 0);
        printf("recv: %s\n", buf);
        send(sockfd_new, "ok", sizeof("ok"), 0);
        if (strcmp(buf, "quit") == 0)
            break;
        // 如果收到了0长度的数据包,意思客户端断开连接,子进程结束
        if (strlen(buf) == 0)
            break;
    }
    return NULL;
}

int main(int argc, char const *argv[])
{
    // 1.创建套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("socket");
        return -1;
    }
    // 端口复用
    int yes = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));
    // 2.绑定bind
    struct sockaddr_in my_addr;
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(8000);
    my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 机器的所有可用IP地址
    int ret = bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr));
    if (ret != 0)
    {
        perror("bind");
        return -1;
    }
    // 3.监听
    int backlog = 10;
    ret = listen(sockfd, backlog);
    if (ret < 0)
    {
        perror("listen");
        return -1;
    }
    // 4.提取,等待一个客户端连接
    struct sockaddr_in cli_addr;
    socklen_t len = sizeof(cli_addr);

    char ip[16] = "";
    int sockfd_new = 0;
    while (1)
    {
        // 保证提取到了正确的客户端,而不是被信号打断
        while (1)
        {
            sockfd_new = accept(sockfd, (struct sockaddr *)&cli_addr, &len);
            if (sockfd_new > 0)
                break;
        }
        inet_ntop(AF_INET, (void *)&cli_addr.sin_addr, ip, 16);
        printf("提取到的客户端: %s--->%hu\n", ip, ntohs(cli_addr.sin_port)); // ip port
        // 5.创建线程
        pthread_t pth;
        pthread_create(&pth, NULL, recv_send_fun, (void *)&sockfd_new);
        pthread_detach(pth);
    }

    // 6.关闭套接字
    close(sockfd_new);
    close(sockfd);
    return 0;
}

 

标签:addr,int,TCP,并发,new,sockfd,服务器,include,buf
From: https://www.cnblogs.com/mengyaoli/p/17902036.html

相关文章

  • 【TCP】并发服务器<进程>
    1#include<stdio.h>2#include<strings.h>//bzero3#include<unistd.h>//close4#include<sys/socket.h>//socket5#include<netinet/in.h>//structsockaddr_in6#include<arpa/inet.h>//inet_add......
  • 【HTTP】服务器代码<线程>
    1#include<stdio.h>2#include<pthread.h>3#include<strings.h>4#include<string.h>5#include<unistd.h>6#include<sys/socket.h>7#include<netinet/in.h>8#include<arpa/inet.h>9......
  • 关于EthernetIP转ModbusTCP协议转换的成熟应用
    在现代工业自动化领域,以太网和互联网的集成已经成为一种趋势。Ethernet/IP转ModbusTCP网关作为一种关键的通信设备,能够实现以太网和ModbusTCP协议之间的转换,从而在工业自动化领域中发挥重要作用。本文将详细介绍Ethernet/IP转ModbusTCP网关的应用和配置方法。Ethernet/IP转Mo......
  • 线程数和并发量关系
    并发数,线程数,吞吐量,每秒事务数(TPS)都是性能测试领域非常关键的数据和指标。那么他们之间究竟是怎样的一个对应关系和内在联系?测试时,我们经常容易将线程数等同于表述为并发数,这一表述正确吗?本文就将对性能领域的这些关键概念做一次探讨。文章可能会比较长,希望您保持耐心看完。......
  • jemter--性能测试(并发量与吞吐量以及线程数关系)
     1.性能测试满足用户量计算(2、8原则):e.g:业务量10000     时间1min   接口平均响应时间为0.4S   调度时间300s ①吞吐量(QPS)=(10000*80%)/(1*60*20%)=667②并发数=线程数(不循环)=QPS*平均响应时间=667*0.4=266             ......
  • 服务器日记
    查看玩法:自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)  自己拥有一台服务器可以做哪些很酷的事情?-知乎(zhihu.com)搜索监控服务器:netdata监控服务器_百度搜索(baidu.com)查看教程:65.7kStar!强大又全面的性能监控工具——Netdata-知乎(zhihu.com)查看......
  • 网络七层协议和TCP
    搭建环境使用nc工具搭建一个TCP服务器。服务端使用命令创建监听端口nc-l-p1023客户端使用命令连接nc<目标ip>-p1023以上使用tcpdump或者wireshark进行抓包搭建环境如下![[Pastedimage20231214135926.png]]使用wireshark抓包如下![[Pastedimage20231214092055.......
  • TCP协议 和 UDP协议 的区别 (三次握手/四次挥手)
    TCP协议拓展:FTP:(File Transfer Protocol)文件传输协议FIle协议:访问本地文件Webscoket:网络通信协议;主动给客户端发送协议FTP:文件传输协议①重点:面试重点:TCP、UDP协议区别UDP(UserDatagramProtocol)......
  • 服务器数据恢复-raid5多块磁盘掉线导致上层卷无法挂载,oracle数据库不可用的数据恢复案
    服务器数据恢复环境:一台服务器中有一组由24块FC硬盘组建的raid5磁盘阵列,linux操作系统+ext3文件系统,服务器上层部署有oracle数据库。服务器故障&检测:raid5阵列中有两块硬盘出现故障掉线,导致服务器上层卷无法挂载,oracle数据库无法正常使用。通过管理后台查看服务器中硬盘的状态,......
  • 如何在 Eolink Apikit 中发起 TCP/UDP 文档测试
    TCP/UDP是两种常用的网络传输协议。TCP协议提供可靠的连接,而UDP协议提供不可靠的连接。TCP协议是面向连接的协议,在建立连接之前,客户端和服务器需要先握手。握手完成后,客户端和服务器之间就会建立一个可靠的连接。在连接建立之后,客户端和服务器可以通过该连接进行数据传输。T......