UDP協議服務應用源碼分享
我們知道,UDP協議被規定為不可靠的協議。盡管如此,在一些應用中,UDP協議也比TCP協議有著巨大的優勢。下面我們就來討論下有關內容吧。UDP是一種不可靠的網絡協議,那么還有什么使用價值或必要呢?其實不然,在有些情況下UDP協議可能會變得非常有用。因為UDP具有TCP所望塵莫及的速度優勢。雖然TCP協議中植入了各種安全保障功能,但是在實際執行的過程中會占用大量的系統開銷,無疑使速度受到嚴重的影響。反觀UDP由于排除了信息可靠傳遞機制,將安全和排序等功能移交給上層應用來完成,極大降低了執行時間,使速度得到了保證。
關于UDP協議的最早規范是RFC768,1980年發布。盡管時間已經很長,但是UDP協議仍然繼續在主流應用中發揮著作用。包括視頻電話會議系統在內的許多應用都證明了UDP協議的存在價值。因為相對于可靠性來說,這些應用更加注重實際性能,所以為了獲得更好的使用效果(例如,更高的畫面幀刷新速率)往往可以犧牲一定的可靠性(例如,會面質量)。這就是UDP和TCP兩種協議的權衡之處。根據不同的環境和特點,兩種傳輸協議都將在今后的網絡世界中發揮更加重要的作用。
UDP Server程序
1、編寫UDP Server程序的步驟
(1)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。
(2)初始化sockaddr_in結構的變量,并賦值。sockaddr_in結構定義:
- struct sockaddr_in {
- uint8_t sin_len;
- sa_family_t sin_family;
- in_port_t sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
- };
這里使用“08”作為服務程序的端口,使用“INADDR_ANY”作為綁定的IP地址即任何主機上的地址。
(3)使用bind()把上面的socket和定義的IP地址和端口綁定。這里檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程序重復運行的問題。
(4)進入無限循環程序,使用recvfrom()進入等待狀態,直到接收到客戶程序發送的數據,就處理收到的數據,并向客戶程序發送反饋。這里是直接把收到的數據發回給客戶程序。
2、udpserv.c程序內容:
- #include
- #include
- #include
- #include
- #include
- #include
- #define MAXLINE 80
- #define SERV_PORT 8888
- void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
- {
- int n;
- socklen_t len;
- char mesg[MAXLINE];
- for(;;)
- {
- len = clilen;/* waiting for receive data */
- n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);/* sent data back to client */
- sendto(sockfd, mesg, n, 0, pcliaddr, len);
- }
- }
- int main(void)
- {
- int sockfd;
- struct sockaddr_in servaddr, cliaddr;
- sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */
- /* init servaddr */
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(SERV_PORT);
- /* bind address and port to socket */
- if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
- {
- perror("bind error");
- exit(1);
- }
- do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
- return 0;
- }
到這里,我們對UDP協議的一些程序應用進行了簡單的介紹,那么在后續的文章中,我們將會UDP Client程序內容進行一下分析。