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

C/S客戶端核服務(wù)端-并發(fā)服務(wù)器

這篇具有很好參考價值的文章主要介紹了C/S客戶端核服務(wù)端-并發(fā)服務(wù)器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

使用方法

1、新建兩個程序,分別引用兩個函數(shù),先執(zhí)行server端的程序,再執(zhí)行client端的程序
2、實現(xiàn)功能:當client和sever連接成功后,從client輸入什么都會傳輸給server端,當輸入第一個字母為q時 兩端程序都會退出
3、特別注意:需要修改SERVER_HOST 為自己主機地址
4、本程序編寫的環(huán)境,如果時windows下執(zhí)行可能需要修改頭文件什么的,耐心一點看就好

gcc -v
gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04.1)

cmake -version
cmake version 3.22.1

make -v
GNU Make 4.3

一、使用線程實現(xiàn)并發(fā)服務(wù)器

1、服務(wù)器端代碼

優(yōu)化功能:

1、再任意主機上可以運行代碼
2、添加讀取客戶信息
3、允許地址快速重用,當服務(wù)器斷開后可以快速重用

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define SERVER_PORT 5001 // 本地字節(jié)序
#define SERVER_HOST "192.168.0.43"
#define SERVER_BACKLOG 5
#define SERVER_QUIT "q"
#define SERVER_SIZE 32

void *cli_data_handle(void *arg)
{
    int newfd = *(int *)arg;
    char buf[SERVER_SIZE];
    printf("%s %d newfd = %d\n", __func__, __LINE__, newfd);
    while (1)
    {
        memset(buf, 0, SERVER_SIZE);
        int recread = read(newfd, buf, SERVER_SIZE - 1);
        if (recread > 0)
        {
            printf("%s %d buf = %s\n", __func__, __LINE__, buf);
            if (!strncasecmp(buf, SERVER_QUIT, strlen(SERVER_QUIT)))
            {
                printf("%s %d q======\n", __func__, __LINE__);
                break;
            }
        }

        usleep(100);
    }
    close(newfd);

    return NULL;
}
int test_server()
{
    printf("%s %d \n", __func__, __LINE__);

    int fd = -1;
    struct sockaddr_in addr_in;
    char buf[SERVER_SIZE];
    /*
    AF_INET:IPV4
    SOCK_STREAM:TCP
    */
    // 1、創(chuàng)建socket 得到fd
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0)
    {
        printf("%s %d fd<0\n", __func__, __LINE__);
        return 0;
    }

    // 優(yōu)化3 允許地址快速重用,當服務(wù)器斷開后可以快速重用
    int b_reuse = 1;
    setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&b_reuse,sizeof(int));

    //  2、綁定
    memset(&addr_in, 0, sizeof(addr_in));  // 將變量addr_in置0
    addr_in.sin_port = htons(SERVER_PORT); // 將端口號從本地字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
    addr_in.sin_family = AF_INET;
    // int rec = inet_pton(AF_INET,SERVER_HOST,(void*)&addr_in.sin_addr.s_addr);
    //    if(rec!= 1){
    //     printf("%s %d rec!= 1\n", __func__, __LINE__);
    //         return 0;
    //    }

    // addr_in.sin_addr.s_addr = inet_addr(SERVER_HOST); // 將主機從點分形式轉(zhuǎn)換為32字節(jié)
    // 優(yōu)化1:
    addr_in.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP可以運行
    int rec = bind(fd, (struct sockaddr *)&addr_in, sizeof(addr_in));
    if (rec < 0)
    {
        printf("%s %d rec<0\n", __func__, __LINE__);
        return 0;
    }

    // 3、listen() 將主動套接字轉(zhuǎn)換為被動套接字
    int reclisten = listen(fd, SERVER_BACKLOG); // 允許正在進行連接的客戶端數(shù)目
    if (reclisten < 0)
    {
        printf("%s %d reclisten<0\n", __func__, __LINE__);
        return 0;
    }
    // 4、阻塞等待客戶端連接請求

#if 0
#if 0
    int newfd = accept(fd, NULL, NULL);
    if (newfd < 0)
    {
        printf("%s %d newfd<0\n", __func__, __LINE__);
        return 0;
    }
#else
    // 優(yōu)化2:
    struct sockaddr_in addr_c;
    socklen_t addr_len = sizeof(addr_c);
    int newfd = accept(fd, (struct sockaddr *)&addr_c, &addr_len);
    if (newfd < 0)
    {
        printf("%s %d newfd<0\n", __func__, __LINE__);
        return 0;
    }

    char ipV4_addr[16];
    if (!inet_ntop(AF_INET, (void *)&addr_c.sin_addr.s_addr, ipV4_addr, sizeof(addr_c)))
    {
        // 為空取反 不為空 就執(zhí)行這里
        printf("%s %d newfd<0\n", __func__, __LINE__);
        return 0;
    }

    printf("%s %d addr_c.sin_port = %d\n", __func__, __LINE__, ntohs(addr_c.sin_port));
    printf("%s %d addr_c.sin_addr = %s\n", __func__, __LINE__, ipV4_addr);
#endif
#else
    pthread_t tid;
    struct sockaddr_in addr_c;
    socklen_t addr_len = sizeof(addr_c);
    int newfd;
    while (1)
    {

        newfd = accept(fd, (struct sockaddr *)&addr_c, &addr_len);
        if (newfd < 0)
        {
            printf("%s %d newfd<0\n", __func__, __LINE__);
            return 0;
        }

        char ipV4_addr[16];
        if (!inet_ntop(AF_INET, (void *)&addr_c.sin_addr.s_addr, ipV4_addr, sizeof(addr_c)))
        {
            // 為空取反 不為空 就執(zhí)行這里
            printf("%s %d newfd<0\n", __func__, __LINE__);
            return 0;
        }
        printf("%s %d addr_c.sin_port = %d\n", __func__, __LINE__, ntohs(addr_c.sin_port));
        printf("%s %d addr_c.sin_addr = %s\n", __func__, __LINE__, ipV4_addr);
        pthread_create(&tid, NULL, cli_data_handle, (void *)&newfd);
    }

    close(fd);
    printf("%s %d xxxxxxxxxxxxxx newfd = %d\n", __func__, __LINE__, fd);

#endif

    // 5、讀寫
    // 和最新的newfd進行通信

    return 0;
}

2、客戶端代碼

注意:

使用該函數(shù)時需要注意輸入?yún)?shù):
./project_cmake serv_ip ser_port
./project_cmake 192.168.0.43 5001 //服務(wù)器主機的IP和是設(shè)置的端口號文章來源地址http://www.zghlxwxcb.cn/news/detail-485943.html

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#define SERVER_PORT 5001 // 本地字節(jié)序
#define SERVER_HOST "192.168.0.43"
#define SERVER_BACKLOG 5
#define SERVER_QUIT "q"
#define SERVER_SIZE 32

void usage(char *s)
{
    printf("%s %d %s serv_ip ser_port\n", __func__, __LINE__, s);
    printf("%s %d  serv_ip : server ip address\n", __func__, __LINE__);
    printf("%s %d  ser_port: server port (>5000)\n", __func__, __LINE__);
}
/*
./client serv_ip ser_port

*/
int test_client(int argc, char **argv)
{
    printf("%s %d \n", __func__, __LINE__);
    int port;
    if (argc != 3)
    {
        usage(argv[0]);
        return 0;
    }

    int fd = -1;
    struct sockaddr_in addr_in;
    char buf[SERVER_SIZE];
    /*
    AF_INET:IPV4
    SOCK_STREAM:TCP
    */
    // 1、創(chuàng)建socket 得到fd
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0)
    {
        printf("%s %d fd<0\n", __func__, __LINE__);
        return 0;
    }

    port = atoi(argv[2]);
    if (port < 5000)
    {
        usage(argv[0]);
        return 0;
    }
    /*
    2、連接
    */
    memset(&addr_in, 0, sizeof(addr_in)); // 將變量addr_in置0
    addr_in.sin_port = htons(port);       // 將端口號從本地字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
    addr_in.sin_family = AF_INET;
    int rec = inet_pton(AF_INET, argv[1], (void *)&addr_in.sin_addr.s_addr);
    if (rec != 1)
    {
        printf("%s %d rec!= 1\n", __func__, __LINE__);
        return 0;
    }

    int reccon = connect(fd, (struct sockaddr *)&addr_in, sizeof(addr_in));
    if (reccon < 0)
    {
        printf("%s %d reccon<0\n", __func__, __LINE__);
        return 0;
    }

    // 讀寫

    while (1)
    {
        memset(buf, 0, SERVER_SIZE);
        char *rec_p = fgets(buf, SERVER_SIZE - 1, stdin);

        int recwrite = write(fd, buf, strlen(buf));
        if (recwrite > 0)
        {
            printf("%s %d buf = %s\n", __func__, __LINE__, buf);
            // int recstr = strcmp(buf, SERVER_QUIT);
            int recstr = strncasecmp(buf, SERVER_QUIT, strlen(SERVER_QUIT));
            printf("%s %d recstr = %d\n", __func__, __LINE__, recstr);
            if (0 == recstr)
            {
                printf("%s %d q======\n", __func__, __LINE__);
                break;
            }
        }

        usleep(100);
    }
    close(fd);
    printf("%s %d xxxxxxxxxxxxxx\n", __func__, __LINE__);
    return 0;
}

下面的代碼是上面的基礎(chǔ)將進行進行修改的,可以參考著看!

二、使用進程實現(xiàn)并發(fā)服務(wù)器

1、服務(wù)器端代碼

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define SERVER_PORT 5001 // 本地字節(jié)序
#define SERVER_HOST "192.168.0.43"
#define SERVER_BACKLOG 5
#define SERVER_QUIT "q"
#define SERVER_SIZE 32

void *cli_data_handle(void *arg)
{
    int newfd = *(int *)arg;
    char buf[SERVER_SIZE];
    printf("%s %d newfd = %d\n", __func__, __LINE__, newfd);
    while (1)
    {
        memset(buf, 0, SERVER_SIZE);
        int recread = read(newfd, buf, SERVER_SIZE - 1);
        if (recread > 0)
        {
            printf("%s %d buf = %s\n", __func__, __LINE__, buf);
            if (!strncasecmp(buf, SERVER_QUIT, strlen(SERVER_QUIT)))
            {
                printf("%s %d q======\n", __func__, __LINE__);
                break;
            }
        }

        usleep(100);
    }
    close(newfd);

    return NULL;
}

void sig_child_handle(int signo)
{
    if (signo == SIGCHLD)
    {
        waitpid(-1, NULL, WNOHANG);
    }
}
int test_server()
{
    printf("%s %d \n", __func__, __LINE__);

    int fd = -1;
    struct sockaddr_in addr_in;
    char buf[SERVER_SIZE];
    signal(SIGCHLD, sig_child_handle);
    /*
    AF_INET:IPV4
    SOCK_STREAM:TCP
    */
    // 1、創(chuàng)建socket 得到fd
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0)
    {
        printf("%s %d fd<0\n", __func__, __LINE__);
        return 0;
    }

    // 優(yōu)化4 允許地址快速重用,當服務(wù)器斷開后可以快速重用
    int b_reuse = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));

    //  2、綁定
    memset(&addr_in, 0, sizeof(addr_in));  // 將變量addr_in置0
    addr_in.sin_port = htons(SERVER_PORT); // 將端口號從本地字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序
    addr_in.sin_family = AF_INET;
    // int rec = inet_pton(AF_INET,SERVER_HOST,(void*)&addr_in.sin_addr.s_addr);
    //    if(rec!= 1){
    //     printf("%s %d rec!= 1\n", __func__, __LINE__);
    //         return 0;
    //    }

    // addr_in.sin_addr.s_addr = inet_addr(SERVER_HOST); // 將主機從點分形式轉(zhuǎn)換為32字節(jié)
    // 優(yōu)化1:
    addr_in.sin_addr.s_addr = htonl(INADDR_ANY); // 任意IP可以運行
    int rec = bind(fd, (struct sockaddr *)&addr_in, sizeof(addr_in));
    if (rec < 0)
    {
        printf("%s %d rec<0\n", __func__, __LINE__);
        return 0;
    }

    // 3、listen() 將主動套接字轉(zhuǎn)換為被動套接字
    int reclisten = listen(fd, SERVER_BACKLOG); // 允許正在進行連接的客戶端數(shù)目
    if (reclisten < 0)
    {
        printf("%s %d reclisten<0\n", __func__, __LINE__);
        return 0;
    }
    // 4、阻塞等待客戶端連接請求

    struct sockaddr_in addr_c;
    socklen_t addr_len = sizeof(addr_c);
    int newfd;

    while (1)
    {
        pid_t pid = -1;
        newfd = accept(fd, (struct sockaddr *)&addr_c, &addr_len);
        if (newfd < 0)
        {
            printf("%s %d newfd<0\n", __func__, __LINE__);
            break;
        }
        // 創(chuàng)建一個子進程用于處理已建立連接的客戶的交互數(shù)據(jù)
        if ((pid = fork()) < 0)
        {
            printf("%s %d pid = fork() < 0 \n", __func__, __LINE__);
            break;
        }
        if (0 == pid)
        { // 子進程
            close(fd);
            char ipV4_addr[16];
            if (!inet_ntop(AF_INET, (void *)&addr_c.sin_addr.s_addr, ipV4_addr, sizeof(addr_c)))
            {
                // 為空取反 不為空 就執(zhí)行這里
                printf("%s %d newfd<0\n", __func__, __LINE__);
                return 0;
            }
            printf("%s %d addr_c.sin_port = %d\n", __func__, __LINE__, ntohs(addr_c.sin_port));
            printf("%s %d addr_c.sin_addr = %s\n", __func__, __LINE__, ipV4_addr);
            cli_data_handle(&newfd);
            return 0;
        }
        else
        { // 父線程pid > 0
            close(newfd);
        }
    }

    close(fd);
    printf("%s %d xxxxxxxxxxxxxx newfd = %d\n", __func__, __LINE__, fd);

    // 5、讀寫
    // 和最新的newfd進行通信

    return 0;
}

2、客戶端代碼

和上面一致,這里不贅述。

注意:

使用該函數(shù)時需要注意輸入?yún)?shù):
./project_cmake serv_ip ser_port
./project_cmake 192.168.0.43 5001 //服務(wù)器主機的IP和是設(shè)置的端口號

到了這里,關(guān)于C/S客戶端核服務(wù)端-并發(fā)服務(wù)器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 服務(wù)器異步客戶端

    internal class MessageManagerT:SingletonMessageManagerT { ? ? Dictionaryint, ActionT MsgDic = new Dictionaryint, ActionT(); ? ? public void OnAddListen(int id,ActionT action) ? ? { ? ? ? ? if(MsgDic.ContainsKey(id)) ? ? ? ? { ? ? ? ? ? ? MsgDic[id] += action; ? ? ? ? } ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? MsgDic.Add(id, ac

    2024年04月09日
    瀏覽(24)
  • ZeroTier客戶端連接服務(wù)器

    ZeroTier客戶端連接服務(wù)器 下載客戶端 https://www.zerotier.com/download/ 加入新的網(wǎng)絡(luò)(例如d5e04297a16fa690,由管理員提供) 管理員授權(quán)并告知服務(wù)器IP 測試連接:ping 服務(wù)器IP 使用putty, pycharm, vscode等工具連接即可 官方文檔 https://docs.zerotier.com/getting-started/getting-started 注: 若路由器無法

    2024年02月09日
    瀏覽(27)
  • UDP客戶端和服務(wù)器

    UDP客戶端和服務(wù)器

    UDP客戶端,也就是首先主動發(fā)送數(shù)據(jù)的一方,也就是發(fā)起服務(wù)請求的一方。 UDP服務(wù)器,也就是首先等待接收數(shù)據(jù),并對接收的數(shù)據(jù)進行處理,返回計算結(jié)果的一方,也就是提供服務(wù)的一方。 在下面實驗中使用到的函數(shù) 測試代碼? UDP接收端(服務(wù)器) 執(zhí)行代碼: ?? 實驗解析?

    2024年02月13日
    瀏覽(33)
  • UDP通訊(服務(wù)器/客戶端)

    UDP通訊(服務(wù)器/客戶端)

    前言:UDP通訊實現(xiàn)比較簡單,單某些情況下也會使用,建議先看一下說明,然后運行代碼感受一下。 ????????傳輸層主要應(yīng)用的協(xié)議模型有兩種,一種是TCP協(xié)議,另外一種則是UDP協(xié)議。TCP協(xié)議在網(wǎng)絡(luò)通信中占主導(dǎo)地位,絕大多數(shù)的網(wǎng)絡(luò)通信借助TCP協(xié)議完成數(shù)據(jù)傳輸。但U

    2024年02月03日
    瀏覽(31)
  • Java 構(gòu)建websocket客戶端,構(gòu)建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務(wù)器端,接收服務(wù)器端消息

    Java 構(gòu)建websocket客戶端,構(gòu)建wss客戶端,使用wss連接,并發(fā)送數(shù)據(jù)到服務(wù)器端,接收服務(wù)器端消息 回調(diào)函數(shù)處理

    2024年02月13日
    瀏覽(33)
  • netty構(gòu)建udp服務(wù)器以及發(fā)送報文到客戶端客戶端詳細案例

    netty構(gòu)建udp服務(wù)器以及發(fā)送報文到客戶端客戶端詳細案例

    目錄 一、基于netty創(chuàng)建udp服務(wù)端以及對應(yīng)通道設(shè)置關(guān)鍵 二、發(fā)送數(shù)據(jù) 三、netty中的ChannelOption常用參數(shù)說明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代碼中

    2024年04月09日
    瀏覽(31)
  • 爬蟲——服務(wù)器渲染和客戶端渲染

    爬蟲——服務(wù)器渲染和客戶端渲染

    目錄 爬蟲——服務(wù)器渲染和客戶端渲染 服務(wù)器渲染 客戶端渲染 專業(yè)解釋 服務(wù)器渲染(Server-Side Rendering,SSR)是一種在服務(wù)器端完成頁面渲染的網(wǎng)頁處理技術(shù)。具體來說,就是服務(wù)器在響應(yīng)客戶端請求時,會生成頁面的HTML代碼,并將其返回給客戶端。這種方式的優(yōu)點包括更

    2024年02月06日
    瀏覽(25)
  • SSH客戶端連接遠程服務(wù)器

    目錄 一、什么是客戶端連接遠程服務(wù)器 二、什么是服務(wù)端連接遠程服務(wù)器 三、查看網(wǎng)絡(luò)信息 1、圖形程序查看網(wǎng)絡(luò)信息 2、命令查看網(wǎng)絡(luò)信息 四、SSH客戶端(Linux) 五、SSH客戶端(windows) 六、SSH遠程服務(wù)器 發(fā)起連接的一方,計算機或設(shè)備(稱為客戶端)與另一個計算機或

    2024年02月16日
    瀏覽(17)
  • TDengine服務(wù)器與客戶端安裝

    TDengine服務(wù)器與客戶端安裝

    TDengine官網(wǎng): https://docs.taosdata.com/get-started/package/ https://www.taosdata.com/assets-download/3.0/TDengine-server-3.0.4.1-Linux-x64.tar.gz tar -zxvf TDengine-server- version -Linux-x64.tar.gz tar -zxvf TDengine-server-3.0.4.1-Linux-x64.tar.gz 安裝腳本在執(zhí)行過程中,會通過命令行交互界面詢問一些配置信息。如果希望采取無

    2024年02月05日
    瀏覽(54)
  • 【網(wǎng)絡(luò)】UDP通訊(服務(wù)器/客戶端)

    【網(wǎng)絡(luò)】UDP通訊(服務(wù)器/客戶端)

    前言:UDP通訊實現(xiàn)比較簡單,單某些情況下也會使用,建議先看一下說明,然后運行代碼感受一下。 ????????傳輸層主要應(yīng)用的協(xié)議模型有兩種,一種是TCP協(xié)議,另外一種則是UDP協(xié)議。TCP協(xié)議在網(wǎng)絡(luò)通信中占主導(dǎo)地位,絕大多數(shù)的網(wǎng)絡(luò)通信借助TCP協(xié)議完成數(shù)據(jù)傳輸。但U

    2024年02月12日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包