udp協議是無連線的不可靠的資料報傳輸協議,與tcp協議不同的是,它傳送資料時不需要呼叫connect函式(特殊情況也可呼叫),客戶端只需要呼叫sendto函式給伺服器傳送資料報,其中必須指定目的地位址作為引數,伺服器只需要呼叫recvfrom函式等待某個資料報的到達。
大多數udp伺服器是迭代伺服器(iterative server),大多數tcp伺服器是併發伺服器。
每個udp套接字都有乙個接受緩衝區,到達該套接字的資料報都進入這個套接字接受緩衝區,當程序呼叫recvfrom時,緩衝區中的下乙個資料報以fifo順序返回個程序,所以udp層中是有隱含排隊發生的,接受緩衝區大小可以通過設定so_rcvbuf套接字選項修改。
recvfrom和sendto函式的原型是
#include ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags,
struct sockaddr *from, socklen_t *addrlen);
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags,
const struct sockaddr *to, socklen_t addrlen)
前三個引數sockfd、buff、nbytes等同於read和write的三個引數:描述符、指向讀入或寫出緩衝區的指標和讀寫位元組數。
sendto的to引數指向乙個套接字位址結構,包含有接受者的協議位址,大小又addrlen指定,這是乙個值-結果引數。
recvfrom的後兩個引數類似於accept的最後兩個引數,返回時其中套接字位址結構的內容告訴我們是誰傳送了資料報。
udp的connect函式
connect函式對於udp socket,不會有三次握手,更不會建立鏈結,但是與不掉用connect的udp socket有下面三點不同:
l 傳送資料不需要使用sendto,而是write,send或sendmsg,位址不需要傳
l 接受資料不需要使用recvfrom,而是read,recv或recvmsg,位址不需要(可以避免誤接受)
l 可以同步接受非同步錯誤好處
l 資料報不會發錯,也就是上面8.8節的問題不會出現,因為datagram中記錄了兩端的ip和port,所以udp可以區分
l 編寫程式時,不需要總是傳輸重複的目標ip和埠
l 效率變高,目標位址和埠只需要一次拷貝
使用select和fork的tcp&udp伺服器
#include "unp.h"
void str_echo(int sockfd)
void sig_chld(int signo)
int main(int argc, char const *argv)
if(fd_isset(listenfd, &rset))
close(connfd);
} if(fd_isset(udpfd, &rset))
}}
Select實現併發伺服器
併發伺服器除了可以用多執行緒和多程序實現以外,還可以用select實現單執行緒併發,下面用select實現簡單的示例,伺服器接收客戶端的連線,並將客戶發的訊息返回,如下 伺服器端 main.c include include include include include include inclu...
select伺服器的實現
select函式是來實現多路i o復用輸入 輸出模型。比純粹的阻塞i o模型更具有實用性,因為程式控制程式碼會停在select這裡等待,直到被監視的檔案控制代碼至少有乙個發生了狀態改變。select函式的功能和呼叫順序 使用select函式時可以將多個檔案描述符集中到一起統一監視,專案如下 1 是否...
伺服器select與gevent
select版 tcp伺服器 1.select 原理 在多路復用的模型中,比較常用的有select模型和epoll模型。這兩個都是系統介面,由作業系統提供。當然,python的select模組進行了更高階的封裝。將需要判斷有資料傳來的 可讀的 socket 可以向外傳送資料的 可寫的 socket及...