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...