6 1 基於UDP的伺服器端 客戶端

2021-07-26 07:31:56 字數 2542 閱讀 7660

1.udp套接字原理

可靠性方面來說,tcp的確比udp好,但是udp的結構比tcp簡潔,不會傳送類似ack應答訊息,也不會有seq序號,效能有時比tcp高出很多。同時區分tcp和udp的重要標誌是流控制:tcp的生命在於流控制。

圖中,ip的作用是讓離開主機b的udp資料報準確傳送到主機a,但是最終交給主機a的某一udp套接字的過程則有udp完成,它會根據埠號進行區分。

2.基於udp的伺服器端/客戶端

在tcp中,套接字之間是一一對應的,若為10個客戶端提供服務,則除了守門的伺服器套接字外,還需要10個伺服器端套接字。udp中,伺服器客戶端都只要乙個套接字就ok。

udp的資料io函式:

#include ssize_t sendto(int sock, void *buff,size_t nbytes,int flags,struct sockaddr *to, socklen_t addrlen);

成功時返回傳輸的位元組數,失敗返回-1;

sock:傳輸資料的udp套接字檔案描述符;

nbytes:待傳輸的資料長度,位元組為單位

flags:可選引數,沒有則0;

#include ssize_t recvfrom(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

成功時返回接收的位元組數,失敗時返回-1;

sock:用於接收資料的udp套接字檔案描述符

nbytes:可接受的最大位元組數,不能超過buff的緩衝大小

flags:可選引數,沒有則0

伺服器端**uecho_server.c

#include #include #include #include #include #include #define buf_size 	30

void error_handling(char *message);

int main(int argc, char *argv)

serv_sock = socket(pf_inet,sock_dgram,0);

if(serv_sock == -1)

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family=af_inet;

serv_adr.sin_addr.s_addr=htonl(inaddr_any);

serv_adr.sin_port=htons(atoi(argv[1]));

if(bind(serv_sock,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)

while(1)

close(serv_sock);

return 0;

}void error_handling(char *message)

客戶端**uecho_client.c

#include #include #include #include #include #include #define buf_size 	30

void error_handling(char *message);

int main(int argc, char *argv)

sock = socket(pf_inet,sock_dgram,0);

if(sock == -1)

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family=af_inet;

serv_adr.sin_addr.s_addr=inet_addr(argv[1]);

serv_adr.sin_port=htons(atoi(argv[2]));

while(1)

close(sock);

return 0;

}void error_handling(char *message)

執行結果:

server:

alex@alex-virtualbox:~/share/test/tcpip$ ./uecho_server 9190
client :

alex@alex-virtualbox:~/share/test/tcpip$ ./uecho_client  127.0.0.1 9190

insert message(q to quit):hello

message from server: hello

insert message(q to quit):

基於UDP的伺服器端和客戶端

前面的文章中我們給出了幾個tcp的例子,對於udp而言,只要能理解前面的內容,實現並非難事。udp不像tcp,無需在連線狀態下交換資料,因此基於udp的伺服器端和客戶端也無需經過連線過程。也就是說,不必呼叫 listen 和 accept 函式。udp中只有建立套接字的過程和資料交換的過程。tcp中...

基於UDP的伺服器端和客戶端

前面的文章中我們給出了幾個 tcp 的例子,對於 udp 而言,只要能理解前面的內容,實現並非難事。udp 不像 tcp,無需在連線狀態下交換資料,因此基於 udp 的伺服器端和客戶端也無需經過連線過程。也就是說,不必呼叫 listen 和 accept 函式。udp 中只有建立套接字的過程和資料交...

基於UDP的伺服器端和客戶端

前面我們想過了tcp方式的,現在我們說下udp套接字的方式,內容較少,但是很實用。下面通過信件說明udp的工作原理,這是講解udp時使用的傳統示例,它與udp特性完全相符。寄信前應先在信封上填好寄信人和收信人的位址,之後貼上郵票放進郵筒即可。當然,信件的特點使我們無法確認對方是否收到。另外,郵寄過程...