【Linux网络编程】循环服务器之TCP模型
生活随笔
收集整理的這篇文章主要介紹了
【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模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux网络编程】循环服务器之UDP
- 下一篇: 【Linux网络编程】并发服务器之多进程