四 網路程式設計epoll udp003

2021-10-22 17:37:21 字數 3884 閱讀 5788

5、udp廣播,組播

之前的多程序、多執行緒實現多個連線請求的時候,程式設計師既要管理監聽,又要管理通訊。

select委託核心去做客服端連線請求的監聽,程式設計師專注於通訊

需要給核心一些資料:就是select引數,sizeof得出的單位是位元組

迴圈委託核心做監聽檢測

gdb 除錯

gcc test.c -g -lpthread

gdb ./a.out

進入gdb除錯介面:

set args 9898 // 設定出入引數

rquit

第乙個函式,建立根節點

int

epoll_create

(int size)

;

此函式生成乙個epoll專用的檔案描述符。生成乙個樹的根節點

size:epoll 上能關注的最大描述符數,多了可以自動擴充套件,

第二個函式,往樹上掛節點

int

epoll_ctl

(int epfd,

int op,

int fd,

struct epoll_event * event)

;// 傳入引數

struct epoll_event

;events:

epollin 讀

epollout 寫

epollerr 異常

typedef

union epoll_dataepoll_data_t;

第三個函式,從樹上拷貝節點

用於控制某個epoll檔案描述符事件,可以註冊,修改,刪除

引數:epfd: epoll_create 生成的epoll專用描述符

op:epoll_ctl_add:註冊

epoll_ctl_mod:修改

epoll_ctl_del刪除

fd 關聯的檔案描述符

event 告訴核心要監聽什麼事件,

3、類似select功能的函式

int

epoll_wait

(int epfd,

struct epoll_event * events,

// 結構體陣列,陣列中的每個元素,都是樹的乙個節點,拷貝過來的//傳出引數

int maxevents,

//陣列最大值

int timeout // -1一直 阻塞

);

1、水平觸發模式: --> 根據讀來解釋 epoll預設的工作模式,–> 根據緩衝區判斷是否返回

只要fd對應的緩衝區有資料,epoll——wait返回,返回的次數,與傳送的次數無關

,不管客戶端傳送幾次資料,只要伺服器緩衝區有資料,epoll_wait就返回

2、邊沿觸發模式–> et --> 根據客戶端傳送的次數進行返回

客戶端給server傳送資料,發一次epoll_wait就返回一次

不在乎資料是否讀完

3、邊沿非阻塞模式

select:陣列實現,除非重新編譯核心

poll

epoll

檢視計算機硬體的檔案描述符上限

cat/vi /proc/sys/fs/file-max

2、通過配置檔案修改上限值

/ect/security/limits.conf

* 				soft nofile 8000

* hard nofile 8000

然後重啟虛擬機器,就可以了!

ulimit -a

ulimit -n 3000,命令修改

複習:tcp使用場景:登入、檔案傳輸、

http協議:傳輸層協議也是使用tcp

伺服器、 客戶端、適用範圍

server端需要傳送到固定的埠, 客戶端繫結埠號,收到之後才不會丟棄,

***.***.123.255

經過閘道器出去,再經過閘道器進去目標主機

***.***.121.1 閘道器

***.***.122.1 --> 閘道器

伺服器: 設定廣播許可權

建立套接字 --> socket

fd繫結伺服器ip和埠

(初始化客戶端ip和埠資訊)

struct sockaddr_in cli;

cli.sin_family= af.inet;

cli.port = htons(9898);

inet_pton(af_inet," ***.***.123.255",&cli.adr);

傳送資料

sendto(fd, buf, len,0, ***);

客戶端:

建立套接字

顯示繫結ip和埠

bind();

接收資料 --> server端資料

recvform();

只適用於區域網

給伺服器端開放組播許可權

程序通訊

管道、套接字:偽檔案,存在於核心緩衝區,而不在磁碟,

1、檔案格式:

管道:p

套接字:s

偽檔案2、伺服器端:

建立套接字:

int lfd = socket (af_local,sock_stream,0);

繫結struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,「server.socket」); // server.socket還沒存在目前

bind( lfd,(struct sockaddr8) & serv,len); // 存在了

設定監聽:

listen();

等待接受連線請求:

struct sockaddr_un client;

int len = sizeof(client);

int cfd = accept(lfd,&client,&len);

通訊:send

recv;

斷開連線

close();

3、客戶端:

建立套接字

int fd = socket(af_local,sock_stream,0);

繫結乙個套接字檔案

struct sockaddr_un client;

serv.sun_family = af_local;

strcpy(client.sun_path,「client.socket」); // client.socket還沒存在目前

bind( fd,(struct sockaddr8) & client,len); // 存在了

連線伺服器

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,「server.socket」); // server.socket還沒存在目前

bind( lfd,(struct sockaddr8) & serv,len); // 存在了

connect(fd,&serv,sizeof(server));

通訊:recv

send

關閉close(fd);

Python網路程式設計00 網路基礎

在正式開始學習python網路程式設計之前,先來補充一點網路基礎知識。internet是在一些共享線路上傳送資料的。為了實現共享,tcp通過把你要傳送的資料流分解成很多小資訊包在internet傳輸,而這些資訊報到了接受者的地方會再次重新合成在一起。通過分成很小的資料報,internet鏈結就會用很...

四 網路程式設計 讀寫函式

1 寫函式write 函式原型 size t write int fd,const void buf,size t nbytes write函式將buf中的nbytes位元組內容寫入檔案描述符fd,成功時返回寫的位元組數,失敗時返回 1。在網路程式中,向套接字檔案描述符寫時有兩種情況 1 write...

39 網路程式設計

http協議,hyper text transfer protocol 超文字傳輸協議 是用於從全球資訊網伺服器傳送超文字到本地瀏覽器的傳輸議,http是乙個應用層協議,由請求和響應構成,是乙個標準的客戶端伺服器模型。c s模式 client和server常常分別處在相距很遠的兩台計算機上,clie...