【Linux网络编程】循环服务器之UDP循环模型
生活随笔
收集整理的這篇文章主要介紹了
【Linux网络编程】循环服务器之UDP循环模型
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. UDP循環(huán)服務(wù)器的實現(xiàn)方法
- 03. UDP循環(huán)服務(wù)器模型
- 04. UDP循環(huán)服務(wù)器實現(xiàn)
- 05. 附錄
01. 概述
服務(wù)器設(shè)計技術(shù)有很多,按使用的協(xié)議來分有 TCP 服務(wù)器和 UDP 服務(wù)器,按處理方式來分有循環(huán)服務(wù)器和并發(fā)服務(wù)器。
循環(huán)服務(wù)器與并發(fā)服務(wù)器模型
在網(wǎng)絡(luò)程序里面,一般來說都是許多客戶對應(yīng)一個服務(wù)器(多對一),為了處理客戶的請求,對服務(wù)端的程序就提出了特殊的要求。
目前最常用的服務(wù)器模型
-
循環(huán)服務(wù)器:服務(wù)器在同一時刻只能響應(yīng)一個客戶端的請求
-
并發(fā)服務(wù)器:服務(wù)器在同一時刻可以響應(yīng)多個客戶端的請求
02. UDP循環(huán)服務(wù)器的實現(xiàn)方法
UDP 循環(huán)服務(wù)器每次從套接字上讀取一個客戶端的請求 -> 處理 -> 然后將結(jié)果返回給客戶機(jī)。
因為 UDP 是非面向連接的,沒有一個客戶端可以老是占住服務(wù)端。只要處理過程不是死循環(huán),或者耗時不是很長,服務(wù)器對于每一個客戶機(jī)的請求在某種程度上來說是能夠滿足。
03. UDP循環(huán)服務(wù)器模型
socket(...); // 創(chuàng)建套接字 bind(...); // 綁定while(1) {recvfrom(...); // 接收客戶端的請求process(...); // 處理請求sendto(...); // 反饋處理結(jié)果 }04. UDP循環(huán)服務(wù)器實現(xiàn)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>int main(int argc, char *argv[]) {unsigned short port = 8080; // 本地端口int sockfd;sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 創(chuàng)建udp套接字if(sockfd < 0){perror("socket");exit(-1);}// 初始化本地網(wǎng)絡(luò)信息struct sockaddr_in my_addr;bzero(&my_addr, sizeof(my_addr)); // 清空my_addr.sin_family = AF_INET; // IPv4my_addr.sin_port = htons(port); // 端口my_addr.sin_addr.s_addr = htonl(INADDR_ANY); // ipprintf("Binding server to port %d\n", port);// 綁定int err_log;err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if(err_log != 0){perror("bind");close(sockfd); exit(-1);}printf("receive data...\n");while(1){int recv_len;char recv_buf[512] = {0};struct sockaddr_in client_addr;char cli_ip[INET_ADDRSTRLEN] = "";//INET_ADDRSTRLEN=16socklen_t cliaddr_len = sizeof(client_addr);// 接收客戶端數(shù)據(jù)recv_len = recvfrom(sockfd, recv_buf, sizeof(recv_buf), 0, (struct sockaddr*)&client_addr, &cliaddr_len);// 處理數(shù)據(jù),這里只是把接收過來的數(shù)據(jù)打印inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("\nip:%s ,port:%d\n",cli_ip, ntohs(client_addr.sin_port)); // 客戶端的ipprintf("data(%d):%s\n",recv_len,recv_buf); // 客戶端的數(shù)據(jù)// 反饋結(jié)果,這里把接收直接到客戶端的數(shù)據(jù)回復(fù)過去sendto(sockfd, recv_buf, recv_len, 0, (struct sockaddr*)&client_addr, cliaddr_len);}close(sockfd);return 0; }05. 附錄
【Linux】一步一步學(xué)Linux網(wǎng)絡(luò)編程教程匯總
總結(jié)
以上是生活随笔為你收集整理的【Linux网络编程】循环服务器之UDP循环模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux网络编程】TCP三次握手和四
- 下一篇: 【Linux网络编程】循环服务器之TCP