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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2024/4/24 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux网络编程】循环服务器之TCP模型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. TCP循環服務器實現方法
    • 03. TCP循環服務器模型
    • 04. TCP循環服務器實現
    • 05. 附錄

01. 概述

服務器設計技術有很多,按使用的協議來分有 TCP 服務器UDP 服務器,按處理方式來分有循環服務器并發服務器

循環服務器與并發服務器模型

在網絡程序里面,一般來說都是許多客戶對應一個服務器(多對一),為了處理客戶的請求,對服務端的程序就提出了特殊的要求。

目前最常用的服務器模型

  • 循環服務器:服務器在同一時刻只能響應一個客戶端的請求。

  • 并發服務器:服務器在同一時刻可以響應多個客戶端的請求。

02. TCP循環服務器實現方法

TCP 循環服務器接受一個客戶端的連接,然后處理,完成了這個客戶的所有請求后,斷開連接。TCP 循環服務器一次只能處理一個客戶端的請求,只有在這個客戶的所有請求滿足后,服務器才可以繼續后面的請求。如果有一個客戶端占住服務器不放時,其它的客戶機都不能工作了,因此,TCP 服務器一般很少用循環服務器模型的。

03. TCP循環服務器模型

socket(...);// 創建套接字 bind(...);// 綁定 listen(...);// 監聽while(1) {accept(...);// 取出客戶端的請求連接process(...);// 處理請求,反饋結果close(...);// 關閉連接套接字:accept()返回的套接字 }

04. TCP循環服務器實現

#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; // 本地端口 // 創建tcp套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0){perror("socket");exit(-1);}// 配置本地網絡信息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); // ip// 綁定int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));if( err_log != 0){perror("binding");close(sockfd); exit(-1);}// 監聽,套接字變被動err_log = listen(sockfd, 10); if(err_log != 0){perror("listen");close(sockfd); exit(-1);} printf("listen client @port=%d...\n",port);while(1){ struct sockaddr_in client_addr; char cli_ip[INET_ADDRSTRLEN] = ""; socklen_t cliaddr_len = sizeof(client_addr); // 取出客戶端已完成的連接int connfd;connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if(connfd < 0){perror("accept");continue;}// 打印客戶端的ip和端口inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);printf("----------------------------------------------\n");printf("client ip=%s,port=%d\n", cli_ip,ntohs(client_addr.sin_port));// 接收數據char recv_buf[512] = {0};int len = recv(connfd, recv_buf, sizeof(recv_buf), 0);// 處理數據,這里只是打印接收到的內容printf("\nrecv data:\n");printf("%s\n",recv_buf);// 反饋結果send(connfd, recv_buf, len, 0);close(connfd); //關閉已連接套接字printf("client closed!\n");}close(sockfd); //關閉監聽套接字return 0; }

05. 附錄

【Linux】一步一步學Linux網絡編程教程匯總

總結

以上是生活随笔為你收集整理的【Linux网络编程】循环服务器之TCP模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。