mysql udp伺服器 UDP伺服器

2021-10-17 22:18:39 字數 2876 閱讀 5521

傳輸層主要應用的協議模型有兩種,一種是tcp協議,另外一種則是udp協議。tcp協議在網路通訊中佔主導地位,絕大多數的網路通訊借助tcp協議完成資料傳輸。但udp也是網路通訊中不可或缺的重要通訊手段。

相較於tcp而言,udp通訊的形式更像是發簡訊。不需要在資料傳輸之前建立、維護連線。只專心獲取資料就好。省去了三次握手的過程,通訊速度可以大大提高,但與之伴隨的通訊的穩定性和正確率便得不到保證。因此,我們稱udp為「無連線的不可靠報文傳遞」。

與tcp類似的,udp也有可能出現緩衝區被填滿後,再接收資料時丟包的現象。由於它沒有tcp滑動視窗的機制,通常採用如下兩種方法解決:

1)       伺服器應用層設計流量控制,控制傳送資料速度。

2)       借助setsockopt函式改變接收緩衝區大小。如:

#include

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);int n = 220x1024setsockopt(sockfd, sol_socket, so_rcvbuf,&n, sizeof(n));

c/s模型-udp

udp處理模型

由於udp不需要維護連線,程式邏輯簡單了很多,但是udp協議是不可靠的,保證通訊可靠性的機制需要在應用層實現。

編譯執行server,在兩個終端裡各開乙個client與server互動,看看server是否具有併發服務的能力。用ctrl+c關閉server,然後再執行server,看此時client還能否和server聯絡上。和前面tcp程式的執行結果相比較,體會無連線的含義。

server

#include #include#include#include#include#include#include

#define maxline 80

#define serv_port 6666

int main(void)

{structsockaddr_in servaddr, cliaddr;

socklen_t cliaddr_len;intsockfd;charbuf[maxline];charstr[inet_addrstrlen];inti, n;

sockfd= socket(af_inet, sock_dgram, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family=af_inet;

servaddr.sin_addr.s_addr=htonl(inaddr_any);

servaddr.sin_port=htons(serv_port);

bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

printf("accepting connections ...\n");while (1) {

cliaddr_len= sizeof(cliaddr);

n= recvfrom(sockfd, buf, maxline,0, (struct sockaddr *)&cliaddr, &cliaddr_len);if (n == -1)

perror("recvfrom error");

printf("received from %s at port %d\n",

inet_ntop(af_inet,&cliaddr.sin_addr, str, sizeof(str)),

ntohs(cliaddr.sin_port));for (i = 0; i < n; i++)

buf[i]=toupper(buf[i]);

n= sendto(sockfd, buf, n, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr));if (n == -1)

perror("sendto error");

close(sockfd);return 0;

client

#include #include#include#include#include#include#include

#define maxline 80

#define serv_port 6666

int main(int argc, char *ar**)

{structsockaddr_in servaddr;intsockfd, n;charbuf[maxline];

sockfd= socket(af_inet, sock_dgram, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family=af_inet;

inet_pton(af_inet,"127.0.0.1", &servaddr.sin_addr);

servaddr.sin_port=htons(serv_port);while (fgets(buf, maxline, stdin) !=null) {

n= sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));if (n == -1)

perror("sendto error");

n= recvfrom(sockfd, buf, maxline, 0, null, 0);if (n == -1)

perror("recvfrom error");

write(stdout_fileno, buf, n);

close(sockfd);return 0;

執行結果:

UDP簡單伺服器

udp簡單伺服器與客戶端 這裡用到了 recvfrom 表示接受來自何處的連線請求資訊 sendto 要向何處傳送 下面這段 是伺服器原始碼 下面主要用到 socket 建立udp協議的套接字 bind 繫結本機三元資訊 recvfrom 接收客戶端向本機伺服器傳送來得資訊 sendto 向客戶端傳...

基於UDP協議的伺服器 UDP伺服器建立方案

udp伺服器就是實現乙個基於udp協議的伺服器來與客戶端通訊。就是用來收發資料,進行資料處理的。與tcp伺服器不同的是不用建立連線,直接呼叫recvfrom來收包。跟tcp伺服器一樣,udp伺服器也可以通過使用 socketserver 庫很容易地被建立。先定義乙個實現 handle 特殊方法的類,...

UDP伺服器的實現

udp是一種面向無連線的不可靠傳輸協議,有處理速度快 消耗資源小的特點。好奇udp通訊怎麼實現併發服務。tcp可以通過監聽服務,建立新的會話,實現併發 udp沒有這種監聽機制,如何實現併發?其實,udp本身就可連線多個客戶端。udp是不區分客戶端,也不需要等待客戶端的連線請求。這樣就不用併發處理了。...