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

2023.07.29 驅(qū)動(dòng)開(kāi)發(fā)DAY6

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

通過(guò)epoll實(shí)現(xiàn)一個(gè)并發(fā)服務(wù)器

服務(wù)器

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>

#define ERR_MSG(msg)               \
do {                               \
    printf("LINE: %d\n", __LINE__);\
    perror(msg);                   \
} while(0)

#define PORT 6666
#define IP "127.0.0.1"

int main(int argc,const char * argv[])
{
    //創(chuàng)建流式套接字
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket create success\n");

    //允許端口快速?gòu)?fù)用
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("setsockopt success\n");

    //填充地址信息結(jié)構(gòu)體
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    //將IP地址和端口號(hào)綁定到指定的套接字文件描述符上
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");
    
    //將通訊套接字設(shè)置為被動(dòng)監(jiān)聽(tīng)狀態(tài)
    if(listen(sfd, 128) < 0)
    {
        ERR_MSG("listen");
        return -1;
    }
    printf("listen success\n");

    // 創(chuàng)建epoll句柄
    int epfd = epoll_create(1);
    if(epfd < 0)
    {
        printf("epoll_create filed\n");
        return -1;
    }

    // 添加準(zhǔn)備就緒事件進(jìn)入epoll;
    struct epoll_event event;
    struct epoll_event events[10]; //存放就緒事件描述符的數(shù)組
    event.events = EPOLLIN; // 讀事件
    event.data.fd = sfd;
    if(epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &event) < 0)
    {
        printf("epoll_ctl add filed\n");
    }

    //監(jiān)聽(tīng)事件是否發(fā)生
    struct sockaddr_in cin;        //存儲(chǔ)客戶端信息
    socklen_t len = sizeof(cin);
    struct sockaddr_in savecin[1024];
    int ret, res;
    char buf[128] = {};
    while(1)
    {
        //如果成功,ret接收返回的事件個(gè)數(shù),把就緒的事件放在events數(shù)組中
        ret = epoll_wait(epfd, events, 10, -1);
        if(ret < 0)
        {
            printf("epoll_wait filed\n");
            return -1;
        }

        //循環(huán)遍歷數(shù)組,做事件處理
        for(int i=0; i<ret; i++)
        {
            if(events[i].events & EPOLLIN)
            {
                if(events[i].data.fd == sfd)
                {
                    //觸發(fā)客戶端連接事件
                    int newfd = accept(sfd, (struct sockaddr*)&cin, &len);
                    if(newfd < 0)
                    {
                        ERR_MSG("accpet");
                        return -1;
                    }
                    printf("[%s:%d] 客戶端連接成功 newfd=%d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd);
                    savecin[newfd] = cin;

                    //添加新連接客戶端進(jìn)入epoll;
                    event.events = EPOLLIN; // 讀事件
                    event.data.fd = newfd;
                    if(epoll_ctl(epfd, EPOLL_CTL_ADD, newfd, &event) < 0)
                    {
                        printf("epoll_ctl add filed\n");
                        return -1;
                    }
                }
                else
                {
                    //觸發(fā)客戶端交互事件                   
                    //接收數(shù)據(jù)
                    int cfd = events[i].data.fd;
                    bzero(buf, sizeof(buf));
                    res = recv(cfd, buf, sizeof(buf), 0);
                    if(res < 0)
                    {
                        ERR_MSG("recv");
                        return -1;
                    }
                    else if(res == 0)
                    {
                        printf("[%s:%d] 客戶端下線 cfd=%d\n", inet_ntoa(savecin[cfd].sin_addr), ntohs(savecin[cfd].sin_port), cfd);
                        close(cfd); // 關(guān)閉文件描述符
                        
                        //添加斷開(kāi)連接的客戶端從epoll中刪除;
                        if(epoll_ctl(epfd, EPOLL_CTL_DEL, cfd, NULL) < 0)
                        {
                            printf("epoll_ctl del filed\n");
                            return -1;
                        }
                        continue;
                    }
                    printf("[%s:%d] cfd=%d: %s\n", inet_ntoa(savecin[cfd].sin_addr), ntohs(savecin[cfd].sin_port), cfd, buf);
 
                    // 發(fā)送數(shù)據(jù)
                    strcat(buf, "*_*");
                    if(send(cfd, buf, sizeof(buf), 0) < 0)
                    {
                        ERR_MSG("send");
                        return -1;
                    }
                }
            }
        }
    }
    return 0;
}

客戶端

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define ERR_MSG(msg)               \
do {                               \
    printf("LINE: %d\n", __LINE__);\
    perror(msg);                   \
} while(0)

#define PORT 6666
#define IP "127.0.0.1"

int main(int argc,const char * argv[])
{
    //創(chuàng)建流式套接字
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if(cfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket create success\n");

    //填充地址信息結(jié)構(gòu)體
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    //連接到服務(wù)器
    if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("connect");
        return -1;
    }
    printf("connect server success\n");

    char buf[128] = "";
    ssize_t res = 0;
    while(1)
    {
        //發(fā)送數(shù)據(jù)
        bzero(buf, sizeof(buf));
        printf("請(qǐng)輸入>>> ");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = 0;
 
        if(send(cfd, buf, sizeof(buf), 0) < 0)
        {
            ERR_MSG("send");
            return -1;
        }
        printf("發(fā)送成功\n");
 
        //接收數(shù)據(jù)
        bzero(buf, sizeof(buf));
        res = recv(cfd, buf, sizeof(buf), 0);
        if(res < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        else if(0 == res)
        {
            printf("[%s:%d] 服務(wù)器下線\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port));
            break;
        }
        printf("[%s:%d]: %s\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), buf); 
    }
 
    close(cfd);
    return 0;
}

運(yùn)行結(jié)果

2023.07.29 驅(qū)動(dòng)開(kāi)發(fā)DAY6,驅(qū)動(dòng)開(kāi)發(fā)

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

到了這里,關(guān)于2023.07.29 驅(qū)動(dòng)開(kāi)發(fā)DAY6的文章就介紹完了。如果您還想了解更多內(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)文章

  • 2023.08.01 驅(qū)動(dòng)開(kāi)發(fā)day8

    2023.08.01 驅(qū)動(dòng)開(kāi)發(fā)day8

    驅(qū)動(dòng)層 應(yīng)用層?

    2024年02月14日
    瀏覽(14)
  • 作業(yè)day6

    數(shù)據(jù)庫(kù) sqlite3 sq.db 如果sq.db存在則直接打開(kāi)sq.db數(shù)據(jù)庫(kù),如果不存在則先創(chuàng)建再打開(kāi); ? 系統(tǒng)命令 需要以 . 開(kāi)頭,不需要以 ; 結(jié)尾 .quit 退出數(shù)據(jù)庫(kù) .exit 退出數(shù)據(jù)庫(kù) .help 顯示幫助信息,獲取所有系統(tǒng)命令; ? .table 查看當(dāng)前數(shù)據(jù)庫(kù)下的所有表格; .schema 查看表的結(jié)構(gòu) 創(chuàng)建表格c

    2024年02月20日
    瀏覽(23)
  • Day6 Qt

    Day6 Qt

    思維導(dǎo)圖 1.數(shù)據(jù)庫(kù)增刪改查 頭文件widget.h 2.widget.cpp 視頻處理 頭文件

    2024年01月16日
    瀏覽(14)
  • C++ DAY6

    C++ DAY6

    又叫鉆石繼承,由公共子類派生出多個(gè)中間子類,又由多個(gè)中間子類派生出匯聚子類, 匯聚子類 會(huì) 從 中間子類 得到從 公共基類 繼承下來(lái)的多個(gè)成員。 由于匯聚子類會(huì)得到中間子類從公共基類繼承下來(lái)的多份基類成員,故引出了虛繼承的概念 為了使匯聚子類只保存一份中

    2024年02月11日
    瀏覽(17)
  • QT day6

    QT day6

    目錄 思維導(dǎo)圖 學(xué)生管理系統(tǒng) ui界面 頭文件 源文件

    2024年01月15日
    瀏覽(20)
  • arm:day6

    arm:day6

    實(shí)現(xiàn)UART通信: 1.鍵盤(pán)輸入一個(gè)字符\\\'a\\\',串口工具顯示\\\'b\\\' ?2.鍵盤(pán)輸入一個(gè)字符串\\\"nihao\\\",串口工具顯示\\\"nihao\\\" uart.h uart4.c main.c

    2024年02月12日
    瀏覽(16)
  • 刷題筆記 day6

    刷題筆記 day6

    ?對(duì)于一個(gè)遞增排序的數(shù)組,我們可以使用雙指針; 定義指針 left 指向數(shù)組最左端元素 , 定義指針 right 指向數(shù)組最右端元素; 當(dāng) nums[left] + nums[right]? ? target 時(shí),右移指針right; 當(dāng) nums[left] + nums[right]? ?target 時(shí),左移指針left; 當(dāng) nums[left] + nums[right]? ==? target 時(shí),輸出結(jié)果。

    2024年02月13日
    瀏覽(21)
  • QT DAY6作業(yè)

    QT DAY6作業(yè)

    1.學(xué)生管理系統(tǒng),基于QT的數(shù)據(jù)庫(kù)中數(shù)據(jù)表的增刪改查 頭文件 源文件 修改效果圖 刪除效果圖 2.MP4視頻的灰度顯示和均衡模式 源文件 效果圖 3.思維導(dǎo)圖

    2024年01月16日
    瀏覽(17)
  • 藍(lán)橋杯打卡Day6

    藍(lán)橋杯打卡Day6

    文章目錄 N的階乘 基本算術(shù) 整數(shù)查詢 本題思路: 本題是關(guān)于高精度的模板題。 ?本題思路: 本題是高精度的模板題。 本題思路: 本題是高精度的模板題。

    2024年02月09日
    瀏覽(25)
  • Python版Day6

    454. 四數(shù)相加 II 給你四個(gè)整數(shù)數(shù)組 nums1、nums2、nums3 和 nums4 ,數(shù)組長(zhǎng)度都是 n ,請(qǐng)你計(jì)算有多少個(gè)元組 (i, j, k, l) 能滿足: 0 = i, j, k, l n nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 來(lái)源:力扣(LeetCode) 鏈接:https://leetcode.cn/problems/4sum-ii 著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方

    2024年02月07日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包