Linux TCP 通信并发

这篇具有很好参考价值的文章主要介绍了Linux TCP 通信并发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux TCP 通信并发,Linux 网络编程,Linux编程入门,linux,tcp/ip,服务器

多进程

客户端

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //创建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(-1);
    }
    //连接服务器
    struct sockaddr_in serveraddr;
    inet_pton(AF_INET, "192.168.245.129", &serveraddr.sin_addr.s_addr);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(9999);
    int ret = connect(lfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));
    if(ret == -1) {
        perror("connect");
        _exit(-1);
    }
    //通信
    int i = 0;
    char receiveBuf[1024] = {0};
    while(1) {
        sprintf(receiveBuf, "data: %d\n", i++);

        write(lfd, receiveBuf, strlen(receiveBuf));
        sleep(1);
        
        int len = read(lfd, receiveBuf, sizeof(receiveBuf));
        if(len == -1) {
            perror("read");
            exit(0);
        } else if(len > 0) {
            printf("receive server data: %s\n", receiveBuf);
        } else if (len == 0) {
            printf("server closed...");
        }
        
    }
    

    close(lfd);
}

服务器端

#define _XOPEN_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<wait.h>
#include<errno.h>

void recyleChild(int arg) {
    while(1) {
        int ret = waitpid(-1, NULL, WNOHANG);
        if(ret == -1) {
            break;
        } else if (ret == 0) {
            break;
        } else if (ret > 0) {
            printf("pid %d is resaved\n", ret);
        }
    }
}

int main() {

    //注册信号捕捉函数
    struct sigaction act;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    act.sa_handler = recyleChild;
    sigaction(SIGCHLD, &act, NULL);


    //创建socket
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(0);
    }
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = INADDR_ANY;

    //绑定
    int ret = bind(lfd, (struct sockaddr*)&saddr, sizeof(saddr));
    if(ret == -1) { 
        perror("bind");
        exit(0);
    }

    //监听
    ret = listen(lfd, 128);
    if(ret == -1) { 
        perror("listen");
        exit(0);
    }

    //接受链接
    while(1) {
        struct sockaddr_in cliaddr;
        int len = sizeof(cliaddr);
        
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);   
        if(cfd == -1) {
            if(errno == EINTR) {
                continue;
            }
            perror("accept");
            exit(-1);
        }

        //每连接一个,创建一个子进程
        pid_t pid = fork();
        if(pid == 0) {
            char clientIP[16];
            inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, clientIP, 16);
            unsigned short cliPort = ntohs(cliaddr.sin_port);
            printf("Client Port is %d, client addr is %s\n", cliPort, clientIP);

            char recvBuf[1024] = {0};
            while(1) {
                int len = read(cfd, &recvBuf, sizeof(recvBuf));
                if(len == -1) {
                    perror("read");
                    return 0;
                } else if(len > 0) {
                    printf("recv client data : %s \n", recvBuf);
                    
                } else {
                    printf("closed.....");
                }

                write(cfd, &recvBuf, sizeof(recvBuf));
            }
            close(cfd);
            exit(0);
        }
    }
    close(lfd);
    return 0;
}

多线程

服务器

#define _XOPEN_SOURCE
#include<stdio.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<pthread.h>


struct sockinfo {
    int fd;
    struct sockaddr_in saddr;
    pthread_t tid;
};

struct sockinfo sockinfos[128];

void* working(void* arg) {

    struct sockinfo* pinfo = (struct sockinfo*) arg;
    char clientIP[16];
    inet_ntop(AF_INET, &pinfo->saddr.sin_addr.s_addr, clientIP, 16);
    unsigned short cliPort = ntohs(pinfo->saddr.sin_port);
    printf("Client Port is %d, client addr is %s\n", cliPort, clientIP);

    char recvBuf[1024] = {0};
    while(1) {
        int len = read(pinfo->fd, &recvBuf, sizeof(recvBuf));
        if(len == -1) {
            perror("read");
            return 0;
        } else if(len > 0) {
            printf("recv client data : %s \n", recvBuf);
                    
        } else {
            printf("closed.....");
        }

        write(pinfo->fd, &recvBuf, sizeof(recvBuf));
    }
    close(pinfo->fd);
    exit(0);
    return NULL;
}

int main() {
 //创建socket
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(0);
    }
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);
    saddr.sin_addr.s_addr = INADDR_ANY;

    //绑定
    int ret = bind(lfd, (struct sockaddr*)&saddr, sizeof(saddr));
    if(ret == -1) { 
        perror("bind");
        exit(0);
    }

    //监听
    ret = listen(lfd, 128);
    if(ret == -1) { 
        perror("listen");
        exit(0);
    }

    //初始化数据
    int max = sizeof(sockinfos) / sizeof(sockinfos[0]);
    for(int i = 0; i < max; i++) {
        memset(&sockinfos[i], 0, sizeof(sockinfos[i]));
        sockinfos[i].fd = -1;
        sockinfos[i].tid = -1;
    }

    //接受链接
    while(1) {
        struct sockaddr_in cliaddr;
        int len = sizeof(cliaddr);
        
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);   
        if(cfd == -1) {
            perror("accept");
            exit(-1);
        }

        struct sockinfo * pinfo;
        for(int i = 0; i < max; i++) {
            if(sockinfos[i].fd == -1) {
                pinfo = &sockinfos[i];
                break;
            }
            if(i == max - 1) {
                sleep(1);
                i--;
            }
        }

        pinfo->fd = cfd;
        memcpy(&pinfo->saddr, &cliaddr, len);


        //每连接一个,创建一个子进程

        pthread_create(&pinfo->tid, NULL, working, pinfo);

        pthread_detach(pinfo->tid);
    }
    close(lfd);
    return 0;
}

客户端文章来源地址https://www.toymoban.com/news/detail-728168.html

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //创建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(-1);
    }
    //连接服务器
    struct sockaddr_in serveraddr;
    inet_pton(AF_INET, "192.168.245.129", &serveraddr.sin_addr.s_addr);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(9999);
    int ret = connect(lfd, (struct sockaddr *) &serveraddr, sizeof(serveraddr));
    if(ret == -1) {
        perror("connect");
        _exit(-1);
    }
    //通信
    int i = 0;
    char receiveBuf[1024] = {0};
    while(1) {
        sprintf(receiveBuf, "data: %d\n", i++);

        write(lfd, receiveBuf, strlen(receiveBuf));
        sleep(1);
        
        int len = read(lfd, receiveBuf, sizeof(receiveBuf));
        if(len == -1) {
            perror("read");
            exit(0);
        } else if(len > 0) {
            printf("receive server data: %s\n", receiveBuf);
        } else if (len == 0) {
            printf("server closed...");
        }
        
    }
    

    close(lfd);
}

到了这里,关于Linux TCP 通信并发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux学习之网络编程3(高并发服务器)

    Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 问题: 根据上一个笔记,我们可以写出一个简单的服务端和客户端通信,但是我们发现一个问题——服务器只能连接一个

    2024年02月01日
    浏览(50)
  • 【Linux网络】网络编程套接字(TCP)

    目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket  服务端创建套接字  服务端绑定  服务端监听  服务端获取连接  服务端处理请求 客户端创建套接字 客户端连接服务器 客户端发起请求 服务器测试

    2024年03月21日
    浏览(71)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(56)
  • 【Linux网络编程】网络编程套接字(TCP服务器)

    作者:爱写代码的刚子 时间:2024.4.4 前言:本篇博客主要介绍TCP及其服务器编码 只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP地址 但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换 字符串转in

    2024年04月14日
    浏览(79)
  • Linux网络编程——tcp套接字

    本章Gitee仓库:tcp套接字 客户端: 客户端: 关于构造和初始化,可以直接在构造的时候,将服务器初始化,那为什么还要写到 init 初始化函数里面呢? 构造尽量简单一点,不要做一些“有风险”的操作。 tcp 是面向连接的,通信之前要建立连接,服务器处于等待连接到来的

    2024年02月20日
    浏览(58)
  • Linux网络编程(TCP状态转换关系)

    本篇文章来讲解一下TCP的状态转换关系,学习这个状态转换关系对于我们深入了解网络编程是非常有必要的。 客户端状态转换: 1.CLOSED - SYN-SENT:当客户端尝试与服务器建立连接时,客户端从CLOSED状态转换到SYN-SEND状态。此时客户端发送SYN(同步)包,表示请求建立连接,并

    2024年02月07日
    浏览(45)
  • Linux网络编程之TCP文件传输

    1. 要求 在Linux环境下,编程实现文件的上传和下载,即客户端可以发送文件给服务器,服务器将文件写到服务器端文件系统中;客户端请求下载文件时服务器读取文件内容,发送给客户端,客户端接收内容并写入本地文件。要求 (1)源代码格式化良好并适当注释; (2)除上述核心功

    2024年02月08日
    浏览(43)
  • Linux网络编程(四)——UDP通信

    目录 0x01 UDP协议 一、UDP通信简介以及接口 二、UDP的接口 三、UDP收发例程 0x02 广播 一、设置广播数据函数接口 二、广播代码实现 0x03 组播(多播) 一、组播地址 二、设置组播函数接口 三、代码实现 UDP是一个面向无连接的,不可靠的服务,功能即为在IP的数据报服务之上增

    2024年02月12日
    浏览(47)
  • 【Linux】网络---->套接字编程(TCP)

    TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 1.准备过程:服务端和客户端需要创建各自的套接字,除此之外服务端还需要绑定自己的地址信息和进行监听。注意:服务端调用listen函数后,处理监听状

    2024年02月04日
    浏览(67)
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装

    前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h 🌈ThreadPool.cpp 🌈ChildTask.h  🌈ChildTask.cpp 🌈BaseTask.h 🌈BaseTask.cpp 三、测试效果 四、总结 📌创建线程池的好处 本文主要学习 Linux内核编程 ,结合

    2024年01月16日
    浏览(95)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包