單使用者UDP伺服器的簡單實現

2021-09-30 13:50:06 字數 3430 閱讀 2696

單使用者udp伺服器的簡單實現

今天我們來分享一下單使用者

udp伺服器的簡單實現。

udp協議是一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,所以通過udp伺服器傳輸的資料不具備可靠性。

其次,說說udp

協議的特點:

1.udp報文沒有可靠性保證、順序保證和流量控制欄位等,可靠性較差。

2.udp有不提供資料報分組、組裝和不能對資料報進行排序的缺點。

3.但由於udp傳輸資料不建立連線,所以udp幾乎不占用過多系統資源。,因此也就不需要維護連線狀態,包括收發狀態等,因此一台服務機可同時向多個客戶機傳輸相同的訊息。

4.udp傳輸的吞吐量不受擁擠控制演算法的調節,只受應用軟體生成資料的速率、傳輸頻寬、源端和終端主機效能的限制。

5.而且正因為udp協議的控制選項較少,在資料傳輸過程中延遲小、資料傳輸效率高,適合對可靠性要求不高的應用程式,或者可以保障可靠性的應用程式。

再來說說,udp伺服器和tcp

伺服器的區別:

1>tcp協議中含了專門的傳遞保證機制,當資料接收方收到傳送方傳來的資訊時,會自動向傳送方發出確認訊息;傳送方只有在接收到該確認訊息之後才繼續傳送其它資訊,否則將一直等待直到收到確認資訊為止。

所以,tcp伺服器需要利用listen函式來監視,有無伺服器來請求鏈結,並基於請求應答機制,來確保資料的可靠性。

2>而udp協議並不提供資料傳送的保證機制。如果在從傳送方到接收方的傳遞過程**現資料報的丟失,協議本身並不能做出任何檢測或提示。

因此,udp伺服器不需要監視有無伺服器來請求鏈結,也沒有請求應答機制,來確保資料的可靠性。所以通過udp伺服器傳輸的資料不具備可靠性。

udp在使用者空間實現可靠性:

由於udp伺服器傳輸的資料不具備可靠性,所以它主要用於不要求分組順序到達的傳輸中,分組傳輸順序的檢查與排序由應用層完成,提供面向事務的簡單不可靠資訊傳送服務。雖然udp是乙個不可靠的協議,但它是分發資訊的乙個理想協議。

udp可以採用重發請求(arq)協議來要實現無差錯的傳輸資料,能一定程度上,實現在使用者空間的可靠性。而重發請求(arq)協議又可分為連續arq協議、選擇重發arq協議、滑動視窗協議。

採用滑動視窗協議,限制已傳送出去但未被確認的資料幀的數目。迴圈重複使用已收到的那些資料幀的序號。具體實現是在傳送端和接收端分別設定傳送視窗和接收視窗。

於是,在接收視窗和傳送視窗間存在著這樣的關係:接收視窗發生旋轉後,傳送視窗才可能向前旋轉,接收視窗保持不動時,傳送視窗是不會旋轉的。這種收發視窗按如此規律順時鐘方向不斷旋轉的協議就犯法為滑動視窗協議。

最後來說說實現的單使用者的udp

伺服器的

步驟和源**以及實現後的執行示例。

伺服器端

1>main函式傳參  argc ar**,包含伺服器的埠號8080和ip位址

2>用socket函式建立listen_socket套接字

3>用bind函式繫結套接字和埠號以及ip

迴圈體:

4>利用udp伺服器特有的recvfrom()函式來讀取資料。

5>利用udp伺服器特有的sendto()函式來傳送資料。

客服端1>main函式傳參  argc ar**,包含伺服器的埠號8080和ip位址

2>用socket函式建立套接字

3>利用udp伺服器特有的sendto()函式來傳送資料。

4>利用udp伺服器特有的recvfrom()函式來讀取資料。

源**如下:

server.c

1 #include2 #include3 #include4 #include5 #include6

7 static void usage(char* proc)

10 11 int main(int arg, char* ar**)

16 17 int sock = socket(af_inet, sock_dgram, 0);

18 if(sock<0)

22 23 struct sockaddr_in server

24 server.sin_family = af_inet;

25 server.sin_port = htons(atoi(ar**[2]));

26 server.sin_addr.s_addr = inet_addr(ar**[1]);

27 if(bind(sock,(struct sockaddr*)&server,sizeof(server))<0)

31 32 char buf[1024];

33 while(1)

48 }

49 50 close(sock);

51 return 0;

52 53 }

client.c

1 #include2 #include3 #include4 #include5 #include6

7 static void usage(char* proc)

10 11 int main(int arg, char* ar**)

16 17 int sock = socket(af_inet, sock_dgram, 0);

18 if(sock<0)

22 23 struct sockaddr_in server;

24 server.sin_family = af_inet;

25 server.sin_port = htons(atoi(ar**[2]));

26 server.sin_addr.s_addr = inet_addr(ar**[1]);

27 socklen_t len = sizeof(server);

28 29 char buf[1024];

30 while(1)

47 }

48 }

49 50 close(sock);

51 return 0;

52 53 }

makefile

1 .phony:all

2 all:rclient rserves

3 4 rclient:client.c

5 gcc -o $@ $^

6 rserves:serves.c

7 gcc -o $@ $^

8 9 .phony:clean

10 clean:

11 rm -f rclient rserves

執行結果

此次分享如上!如有錯誤,望指正!願共同進步!

Linux伺服器進入與退出單使用者模式

這裡先引用別人的一段話 首先說單使用者模式就是只有乙個使用者可以進入,比如說你開啟了伺服器,正在執行著,然後同時你想在別的電腦上遠端進入該系統,此時遠端的你相當於第二個使用者。但是抱歉,因為你之前開啟了單使用者模式,現在想遠端是執行不了的。我就是遇到了這個尷尬的問題,伺服器被別人勿進了單使用者模式。...

UDP伺服器的簡單實現

伺服器端 include include include include include include define err exit m do while 0 int main int argc,char argv int sock socket af inet,sock dgram,0 if ...

UDP簡單伺服器

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