日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux网络编程】循环服务器之UDP循环模型

發(fā)布時間:2024/4/24 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。