国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux TCP 通信并發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了Linux TCP 通信并發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Linux TCP 通信并發(fā),Linux 網(wǎng)絡(luò)編程,Linux編程入門,linux,tcp/ip,服務(wù)器

多進(jìn)程

客戶端

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //創(chuàng)建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(-1);
    }
    //連接服務(wù)器
    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);
}

服務(wù)器端

#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() {

    //注冊(cè)信號(hào)捕捉函數(shù)
    struct sigaction act;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    act.sa_handler = recyleChild;
    sigaction(SIGCHLD, &act, NULL);


    //創(chuàng)建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);
    }

    //監(jiān)聽
    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);
        }

        //每連接一個(gè),創(chuàng)建一個(gè)子進(jìn)程
        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;
}

多線程

服務(wù)器

#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() {
 //創(chuàng)建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);
    }

    //監(jiān)聽
    ret = listen(lfd, 128);
    if(ret == -1) { 
        perror("listen");
        exit(0);
    }

    //初始化數(shù)據(jù)
    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);


        //每連接一個(gè),創(chuàng)建一個(gè)子進(jìn)程

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

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

客戶端文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-728168.html

#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main() {
    //創(chuàng)建套接字
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if(lfd == -1) {
        perror("socket");
        exit(-1);
    }
    //連接服務(wù)器
    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);
}

到了這里,關(guān)于Linux TCP 通信并發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器)

    Linux學(xué)習(xí)之網(wǎng)絡(luò)編程3(高并發(fā)服務(wù)器)

    Linux網(wǎng)絡(luò)編程我是看視頻學(xué)的,Linux網(wǎng)絡(luò)編程,看完這個(gè)視頻大概網(wǎng)絡(luò)編程的基礎(chǔ)差不多就掌握了。這個(gè)系列是我看這個(gè)Linux網(wǎng)絡(luò)編程視頻寫的筆記總結(jié)。 問(wèn)題: 根據(jù)上一個(gè)筆記,我們可以寫出一個(gè)簡(jiǎn)單的服務(wù)端和客戶端通信,但是我們發(fā)現(xiàn)一個(gè)問(wèn)題——服務(wù)器只能連接一個(gè)

    2024年02月01日
    瀏覽(29)
  • 【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(TCP)

    【Linux網(wǎng)絡(luò)】網(wǎng)絡(luò)編程套接字(TCP)

    目錄 地址轉(zhuǎn)換函數(shù) 字符串IP轉(zhuǎn)整數(shù)IP 整數(shù)IP轉(zhuǎn)字符串IP 關(guān)于inet_ntoa 簡(jiǎn)單的單執(zhí)行流TCP網(wǎng)絡(luò)程序 TCP socket API 詳解及封裝TCP socket? 服務(wù)端創(chuàng)建套接字? 服務(wù)端綁定? 服務(wù)端監(jiān)聽? 服務(wù)端獲取連接? 服務(wù)端處理請(qǐng)求 客戶端創(chuàng)建套接字 客戶端連接服務(wù)器 客戶端發(fā)起請(qǐng)求 服務(wù)器測(cè)試

    2024年03月21日
    瀏覽(112)
  • Linux網(wǎng)絡(luò)編程:多進(jìn)程 多線程_并發(fā)服務(wù)器

    文章目錄: 一:wrap常用函數(shù)封裝 wrap.h? wrap.c server.c封裝實(shí)現(xiàn) client.c封裝實(shí)現(xiàn) 二:多進(jìn)程process并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 三:多線程thread并發(fā)服務(wù)器 server.c服務(wù)器 實(shí)現(xiàn)思路 代碼邏輯? client.c客戶端 ???? ??read 函數(shù)的返回值 wrap.h? wrap

    2024年02月12日
    瀏覽(31)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    作者:愛寫代碼的剛子 時(shí)間:2024.4.4 前言:本篇博客主要介紹TCP及其服務(wù)器編碼 只介紹基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員struct in_addr sin_addr表示32位 的IP地址 但是我們通常用點(diǎn)分十進(jìn)制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換 字符串轉(zhuǎn)in

    2024年04月14日
    瀏覽(108)
  • Linux網(wǎng)絡(luò)編程——tcp套接字

    Linux網(wǎng)絡(luò)編程——tcp套接字

    本章Gitee倉(cāng)庫(kù):tcp套接字 客戶端: 客戶端: 關(guān)于構(gòu)造和初始化,可以直接在構(gòu)造的時(shí)候,將服務(wù)器初始化,那為什么還要寫到 init 初始化函數(shù)里面呢? 構(gòu)造盡量簡(jiǎn)單一點(diǎn),不要做一些“有風(fēng)險(xiǎn)”的操作。 tcp 是面向連接的,通信之前要建立連接,服務(wù)器處于等待連接到來(lái)的

    2024年02月20日
    瀏覽(96)
  • Linux網(wǎng)絡(luò)編程之TCP文件傳輸

    Linux網(wǎng)絡(luò)編程之TCP文件傳輸

    1. 要求 在Linux環(huán)境下,編程實(shí)現(xiàn)文件的上傳和下載,即客戶端可以發(fā)送文件給服務(wù)器,服務(wù)器將文件寫到服務(wù)器端文件系統(tǒng)中;客戶端請(qǐng)求下載文件時(shí)服務(wù)器讀取文件內(nèi)容,發(fā)送給客戶端,客戶端接收內(nèi)容并寫入本地文件。要求 (1)源代碼格式化良好并適當(dāng)注釋; (2)除上述核心功

    2024年02月08日
    瀏覽(22)
  • Linux網(wǎng)絡(luò)編程(TCP狀態(tài)轉(zhuǎn)換關(guān)系)

    Linux網(wǎng)絡(luò)編程(TCP狀態(tài)轉(zhuǎn)換關(guān)系)

    本篇文章來(lái)講解一下TCP的狀態(tài)轉(zhuǎn)換關(guān)系,學(xué)習(xí)這個(gè)狀態(tài)轉(zhuǎn)換關(guān)系對(duì)于我們深入了解網(wǎng)絡(luò)編程是非常有必要的。 客戶端狀態(tài)轉(zhuǎn)換: 1.CLOSED - SYN-SENT:當(dāng)客戶端嘗試與服務(wù)器建立連接時(shí),客戶端從CLOSED狀態(tài)轉(zhuǎn)換到SYN-SEND狀態(tài)。此時(shí)客戶端發(fā)送SYN(同步)包,表示請(qǐng)求建立連接,并

    2024年02月07日
    瀏覽(19)
  • Linux網(wǎng)絡(luò)編程(四)——UDP通信

    Linux網(wǎng)絡(luò)編程(四)——UDP通信

    目錄 0x01 UDP協(xié)議 一、UDP通信簡(jiǎn)介以及接口 二、UDP的接口 三、UDP收發(fā)例程 0x02 廣播 一、設(shè)置廣播數(shù)據(jù)函數(shù)接口 二、廣播代碼實(shí)現(xiàn) 0x03 組播(多播) 一、組播地址 二、設(shè)置組播函數(shù)接口 三、代碼實(shí)現(xiàn) UDP是一個(gè)面向無(wú)連接的,不可靠的服務(wù),功能即為在IP的數(shù)據(jù)報(bào)服務(wù)之上增

    2024年02月12日
    瀏覽(20)
  • 【Linux】網(wǎng)絡(luò)---->套接字編程(TCP)

    【Linux】網(wǎng)絡(luò)---->套接字編程(TCP)

    TCP的編程流程:大致可以分為五個(gè)過(guò)程,分別是準(zhǔn)備過(guò)程、連接建立過(guò)程、獲取新連接過(guò)程、消息收發(fā)過(guò)程和斷開過(guò)程。 1.準(zhǔn)備過(guò)程:服務(wù)端和客戶端需要?jiǎng)?chuàng)建各自的套接字,除此之外服務(wù)端還需要綁定自己的地址信息和進(jìn)行監(jiān)聽。注意:服務(wù)端調(diào)用listen函數(shù)后,處理監(jiān)聽狀

    2024年02月04日
    瀏覽(101)
  • 【Linux網(wǎng)絡(luò)編程】高并發(fā)服務(wù)器框架 線程池介紹+線程池封裝

    【Linux網(wǎng)絡(luò)編程】高并發(fā)服務(wù)器框架 線程池介紹+線程池封裝

    前言 一、線程池介紹 ??線程池基本概念 ??線程池組成部分 ??線程池工作原理? 二、線程池代碼封裝 ??main.cpp ??ThreadPool.h ??ThreadPool.cpp ??ChildTask.h? ??ChildTask.cpp ??BaseTask.h ??BaseTask.cpp 三、測(cè)試效果 四、總結(jié) ??創(chuàng)建線程池的好處 本文主要學(xué)習(xí) Linux內(nèi)核編程 ,結(jié)合

    2024年01月16日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包