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);伺服器端**uecho_server.c成功時返回接收的位元組數,失敗時返回-1;
sock:用於接收資料的udp套接字檔案描述符
nbytes:可接受的最大位元組數,不能超過buff的緩衝大小
flags:可選引數,沒有則0
#include #include #include #include #include #include #define buf_size 30客戶端**uecho_client.cvoid 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)
#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特性完全相符。寄信前應先在信封上填好寄信人和收信人的位址,之後貼上郵票放進郵筒即可。當然,信件的特點使我們無法確認對方是否收到。另外,郵寄過程...