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

C/S架構(gòu)學(xué)習(xí)之多線程實(shí)現(xiàn)TCP并發(fā)服務(wù)器

這篇具有很好參考價(jià)值的文章主要介紹了C/S架構(gòu)學(xué)習(xí)之多線程實(shí)現(xiàn)TCP并發(fā)服務(wù)器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

  • 并發(fā)概念:
  • 并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔發(fā)生;
  • 多線程實(shí)現(xiàn)TCP并發(fā)服務(wù)器的實(shí)現(xiàn)流程:
  • 一、創(chuàng)建套接字(socket函數(shù)):
  • 通信域選擇IPV4網(wǎng)絡(luò)協(xié)議、套接字類型選擇流式;
	int sockfd = socket(AF_INET,SOCK_STREAM,0); //通信域選擇IPV4、套接字類型選擇流式
  • 二、填充服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體:
  • 1.定義網(wǎng)絡(luò)信息結(jié)構(gòu)體變量;
  • 2.求出結(jié)構(gòu)體變量的內(nèi)存空間大??;
  • 3.結(jié)構(gòu)體清零;
  • 4.使用IPV4網(wǎng)絡(luò)協(xié)議;
  • 5.預(yù)留給在終端輸入的IP地址;
  • 6.預(yù)留給在終端輸入的網(wǎng)絡(luò)字節(jié)序的端口號(hào);
	struct sockaddr_in serveraddr; //定義網(wǎng)絡(luò)信息結(jié)構(gòu)體變量
    socklen_t serveraddrlen = sizeof(serveraddr);//求出結(jié)構(gòu)體變量的內(nèi)存空間大小

    memset(&serveraddr,0,serveraddrlen); //結(jié)構(gòu)體清零

    serveraddr.sin_family = AF_INET;  //使用IPV4網(wǎng)絡(luò)協(xié)議
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);  //IP地址
    serveraddr.sin_port = htons(atoi(argv[2]));//網(wǎng)絡(luò)字節(jié)序的端口號(hào)
  • 三、套接字和服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體進(jìn)行綁定(bind函數(shù)):
	int ret = bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen);
  • 四、套接字設(shè)置成被動(dòng)監(jiān)聽(tīng)(listen函數(shù)):
	int ret1 = listen(sockfd, 5);
  • 五、阻塞等待客戶端的連接(accept函數(shù)):
		if(-1 == (info.accept_fd = accept(sockfd,(struct sockaddr *)&(info.clientaddr),&clientaddr_len)))
        {
            perror("accept error");
            exit(-1);
        }
  • 六、若有客戶端連接成功,就創(chuàng)建線程,專門用來(lái)和該客戶端通信(pthread_create函數(shù)):
		if(0 != (ret1 = pthread_create(&thread_id,NULL,message_handling,&info)))
        {
            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret1,strerror(ret1));
            exit(EXIT_FAILURE);
        }
  • 七、將線程設(shè)置成分離屬性,線程結(jié)束后由操作系統(tǒng)回收資源(pthread_detach函數(shù)):
        if(0 != (ret2 = pthread_detach(thread_id)))
        {
            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret2,strerror(ret2));
            exit(EXIT_FAILURE);
        }

  • 八、創(chuàng)建線程處理函數(shù)用來(lái)接收來(lái)自客戶端的數(shù)據(jù)(recv函數(shù))和給客戶端發(fā)送應(yīng)答消息(send函數(shù)):
	//線程處理函數(shù)
	void *message_handling(void *arg);
	
	int nbytes = recv(acceptfd,buf,sizeof(buf),0);
	printf("客戶端發(fā)來(lái)數(shù)據(jù)[%s]\n",buf);
	
	strcat(buf,"----k"); //組裝應(yīng)答消息
	int ret2 = send(acceptfd,buf,sizeof(buf),0);
  • 九、退出線程(pthread_exit函數(shù))和關(guān)閉套接字(close函數(shù)):
	close(info.accept_fd);
    pthread_exit(NULL);
  • 綜合應(yīng)用實(shí)例代碼如下所示:
//多線程實(shí)現(xiàn)TCP并發(fā)服務(wù)器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdbool.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>

typedef struct INFO
{
    int accept_fd;

    struct sockaddr_in clientaddr;

}info_t;

//線程處理函數(shù)
void *message_handling(void *arg);

int main(int argc, char const *argv[])
{
    //入?yún)⒑侠硇詸z查
    if(3 != argc)
    {
        printf("Usage : %s <IP> <PORT>\n",argv[0]);
        exit(-1);
    }
    //創(chuàng)建套接字
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("socket error");
        exit(-1);
    }
    //填充服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體
    struct sockaddr_in serveraddr;
    socklen_t serveraddr_len = sizeof(serveraddr);
    memset(&serveraddr,0,serveraddr_len);
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
    serveraddr.sin_port = htons(atoi(argv[2]));

    //將套接字與服務(wù)器網(wǎng)絡(luò)信息結(jié)構(gòu)體綁定
    if(-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len))
    {
        perror("bind error");
        exit(-1);
    }

    //將套接字設(shè)置成被監(jiān)聽(tīng)狀態(tài)
    if(-1 == listen(sockfd,5))
    {
        perror("listen error");
        exit(-1);
    }

    info_t info;
    pthread_t thread_id;
    int ret1 = 0;
    int ret2 = 0;
    socklen_t clientaddr_len = sizeof(info.clientaddr);

    while(true)
    {
        
        //等待客戶端連接
        if(-1 == (info.accept_fd = accept(sockfd,(struct sockaddr *)&(info.clientaddr),&clientaddr_len)))
        {
            perror("accept error");
            exit(-1);
        }
        //若有客戶端連接成功,就創(chuàng)建線程,專門用來(lái)和該客戶端通信
        if(0 != (ret1 = pthread_create(&thread_id,NULL,message_handling,&info)))
        {
            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret1,strerror(ret1));
            exit(EXIT_FAILURE);
        }

        //將線程設(shè)置成分離屬性,線程結(jié)束后由操作系統(tǒng)回收資源
        if(0 != (ret2 = pthread_detach(thread_id)))
        {
            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret2,strerror(ret2));
            exit(EXIT_FAILURE);
        }

    }

    close(sockfd);
    

    return 0;
}

void *message_handling(void *arg)
{
    info_t info = *(info_t *)arg;

    printf("客戶端[%s : %d]連接到服務(wù)器\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));

    //接收客戶端數(shù)據(jù),并作出應(yīng)答

    int nbytes = 0;

    char buf[128] = {0};

    while(true)
    {
        memset(buf,0,sizeof(buf));
        //接收消息
        if(-1 == (nbytes = recv(info.accept_fd,buf,sizeof(buf),0)))
        {
            perror("recv error");
            break;

        }else if(0 == nbytes){

            printf("客戶端[%s : %d]斷開(kāi)了連接\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));
            break;

        }
        if(!strcmp(buf,"quit"))
        {
            printf("客戶端[%s : %d]退出了\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));
            break;
        }
        printf("客戶端[%s : %d]發(fā)來(lái)消息[%s]\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port),buf);

        //組裝應(yīng)答
        strcat(buf,"------k");
        //發(fā)送應(yīng)答
        if(-1 == send(info.accept_fd,buf,sizeof(buf),0))
        {
            perror("send error");
            break;
        }
    }

    close(info.accept_fd);
    pthread_exit(NULL);
    
}
  • 本示例代碼,僅供參考;

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

到了這里,關(guān)于C/S架構(gòu)學(xué)習(xí)之多線程實(shí)現(xiàn)TCP并發(fā)服務(wù)器的文章就介紹完了。如果您還想了解更多內(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)文章

  • 基于多線程實(shí)現(xiàn)服務(wù)器并發(fā)

    基于多線程實(shí)現(xiàn)服務(wù)器并發(fā)

    看大丙老師的B站視頻總結(jié)的筆記 19-基于多線程實(shí)現(xiàn)服務(wù)器并發(fā)分析_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1F64y1U7A2/?p=19spm_id_from=pageDrivervd_source=a934d7fc6f47698a29dac90a922ba5a3 思路:首先accept是有一個(gè)線程的,另外只要這個(gè)accept成功的和一個(gè)客戶端建立了連接,那么我們就需要?jiǎng)?chuàng)

    2024年02月14日
    瀏覽(25)
  • 使用select實(shí)現(xiàn)TCP并發(fā)服務(wù)器模型

    使用select實(shí)現(xiàn)TCP并發(fā)服務(wù)器模型

    本期主要分享的是對(duì)于select的使用,使用select實(shí)現(xiàn)TCP并發(fā)服務(wù)器模型,由于之前所用到的技術(shù)知識(shí)只能夠支撐我們進(jìn)行單個(gè)訪問(wèn),但是有了select之后呢,我們就能夠?qū)崿F(xiàn)多用戶進(jìn)行訪問(wèn);這也是非常符合客觀需求的; 這次呢我們重點(diǎn)來(lái)使用一下select; 用到的頭文件如下: 我

    2024年02月08日
    瀏覽(21)
  • 【高并發(fā)網(wǎng)絡(luò)通信架構(gòu)】2.引入多線程實(shí)現(xiàn)多客戶端連接的tcp服務(wù)端

    【高并發(fā)網(wǎng)絡(luò)通信架構(gòu)】2.引入多線程實(shí)現(xiàn)多客戶端連接的tcp服務(wù)端

    目錄 一,往期文章 二,代碼實(shí)現(xiàn) 關(guān)鍵代碼 完整代碼 運(yùn)行效果 【高并發(fā)網(wǎng)絡(luò)通信架構(gòu)】1.Linux下實(shí)現(xiàn)單客戶連接的tcp服務(wù)端 因?yàn)閍ccept是阻塞等待客戶端連接,當(dāng)客戶端連接成功后才會(huì)執(zhí)行accept后面的代碼,所以為實(shí)現(xiàn)多個(gè)客戶端連接,第一步是將accept放在master循環(huán)里。 rec

    2024年02月13日
    瀏覽(23)
  • TCP服務(wù)器的演變過(guò)程:揭秘使用多線程實(shí)現(xiàn)一對(duì)多的TCP服務(wù)器

    TCP服務(wù)器的演變過(guò)程:揭秘使用多線程實(shí)現(xiàn)一對(duì)多的TCP服務(wù)器

    手把手教你從0開(kāi)始編寫TCP服務(wù)器程序,體驗(yàn)開(kāi)局一塊磚,大廈全靠壘。 為了避免篇幅過(guò)長(zhǎng)使讀者感到乏味,對(duì)【TCP服務(wù)器的開(kāi)發(fā)】進(jìn)行分階段實(shí)現(xiàn),一步步進(jìn)行優(yōu)化升級(jí)。本節(jié)在上一章節(jié)的基礎(chǔ)上,添加多線程,為每個(gè)新接入的客戶端分配線程,實(shí)現(xiàn)一個(gè)服務(wù)器程序處理多

    2024年02月04日
    瀏覽(26)
  • 計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    計(jì)算機(jī)網(wǎng)絡(luò)編程 | 并發(fā)服務(wù)器代碼實(shí)現(xiàn)(多進(jìn)程/多線程)

    歡迎關(guān)注博主 Mindtechnist 或加入【Linux C/C++/Python社區(qū)】一起學(xué)習(xí)和分享Linux、C、C++、Python、Matlab,機(jī)器人運(yùn)動(dòng)控制、多機(jī)器人協(xié)作,智能優(yōu)化算法,濾波估計(jì)、多傳感器信息融合,機(jī)器學(xué)習(xí),人工智能等相關(guān)領(lǐng)域的知識(shí)和技術(shù)。 專欄:《網(wǎng)絡(luò)編程》 當(dāng)涉及到構(gòu)建高性能的服務(wù)

    2024年02月08日
    瀏覽(35)
  • TCP服務(wù)器實(shí)現(xiàn)—多進(jìn)程版,多線程版,線程池版

    TCP服務(wù)器實(shí)現(xiàn)—多進(jìn)程版,多線程版,線程池版

    目錄 前言 1.存在的問(wèn)題 2.多進(jìn)程版 3.多線程版 4.線程池版 總結(jié) ? ? ? ? 在上一篇文章中使用TCP協(xié)議實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的服務(wù)器,可以用來(lái)服務(wù)端和客戶端通信,但是之前的服務(wù)器存在一個(gè)問(wèn)題,就是當(dāng)有多個(gè)客戶端連接服務(wù)器的時(shí)候,服務(wù)器只能和一個(gè)客戶端通信,其它的客

    2024年02月12日
    瀏覽(28)
  • TCP高并發(fā)服務(wù)器簡(jiǎn)介(select、poll、epoll實(shí)現(xiàn)與區(qū)別)

    TCP高并發(fā)服務(wù)器簡(jiǎn)介(select、poll、epoll實(shí)現(xiàn)與區(qū)別)

    一、創(chuàng)建套接字(socket函數(shù)): 二、填充服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體: 三、套接字和服務(wù)器的網(wǎng)絡(luò)信息結(jié)構(gòu)體進(jìn)行綁定(bind函數(shù)): 四、套接字設(shè)置成被動(dòng)監(jiān)聽(tīng)(listen函數(shù)): 五、創(chuàng)建要監(jiān)聽(tīng)的文件描述符集合: 使用select函數(shù)后,會(huì)將 沒(méi)有就緒的文件描述符 在集合中 去除

    2024年01月19日
    瀏覽(24)
  • 【Linux后端服務(wù)器開(kāi)發(fā)】封裝線程池實(shí)現(xiàn)TCP多線程通信

    目錄 一、線程池模塊 Thread.h LockGuard.h ThreadPool.h 二、任務(wù)模塊模塊 Task.h 三、日志模塊 Log.h 四、守護(hù)進(jìn)程模塊 Deamon.h ?五、TCP通信模塊 Server.h Client.h server.cpp client.cpp 關(guān)于TCP通信協(xié)議的封裝,此篇博客有詳述: 【Linux后端服務(wù)器開(kāi)發(fā)】TCP通信設(shè)計(jì)_命運(yùn)on-9的博客-CSDN博客 線程池

    2024年02月16日
    瀏覽(26)
  • 【Linux網(wǎng)絡(luò)編程】TCP并發(fā)服務(wù)器的實(shí)現(xiàn)(IO多路復(fù)用select)

    【Linux網(wǎng)絡(luò)編程】TCP并發(fā)服務(wù)器的實(shí)現(xiàn)(IO多路復(fù)用select)

    服務(wù)器模型主要分為兩種, 循環(huán)服務(wù)器 和 并發(fā)服務(wù)器 。 循環(huán)服務(wù)器 : 在同一時(shí)間只能處理一個(gè)客戶端的請(qǐng)求。 并發(fā)服務(wù)器 : 在同一時(shí)間內(nèi)能同時(shí)處理多個(gè)客戶端的請(qǐng)求。 TCP的服務(wù)器默認(rèn)的就是一個(gè)循環(huán)服務(wù)器,原因是有兩個(gè)阻塞 accept函數(shù) 和recv函數(shù) 之間會(huì)相互影響。

    2024年02月03日
    瀏覽(100)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包