生活随笔
收集整理的這篇文章主要介紹了
Linux网络编程——tcp并发服务器(多进程)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://blog.csdn.net/lianghe_work/article/details/46503895
一、tcp并發服務器概述
一個好的服務器,一般都是并發服務器(同一時刻可以響應多個客戶端 的請求)。并發服務器設計技術一般有:多進程 服務器、多線程 服務器、I/O復用 服務器等。
二、多進程并發服務器
在 Linux 環境下多進程的應用很多,其中最主要的就是網絡/客戶服務器。多進程服務器是當客戶有請求時,服務器用一個子進程來處理客戶請求。父進程繼續等待其它客戶的請求。這種方法的優點 是當客戶有請求時,服務器能及時處理客戶,特別是在客戶服務器交互系統中。對于一個 TCP 服務器,客戶與服務器的連接可能并不馬上關閉,可能會等到客戶提交某些數據后再關閉,這段時間服務器端的進程會阻塞,所以這時操作系統可能調度其它客戶服務進程,這比起循環服務器大大提高了服務性能 。
發達
tcp多進程并發服務器 TCP 并發服務器的思想是每一個客戶機的請求并不由服務器直接處理,而是由服務器創建一個子進程來處理。
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 ; 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; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); 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 ); } while (1 ) { char cli_ip[INET_ADDRSTRLEN] = {0 }; struct sockaddr_in client_addr; socklen_t cliaddr_len = sizeof (client_addr); int connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); if (connfd < 0 ) { perror("accept" ); close(sockfd); exit(-1 ); } pid_t pid = fork(); if (pid < 0 ){ perror("fork" ); _exit(-1 ); }else if (0 == pid){ close(sockfd); char recv_buf[1024 ] = {0 }; int recv_len = 0 ; memset(cli_ip, 0 , sizeof (cli_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)); while ( (recv_len = recv(connfd, recv_buf, sizeof (recv_buf), 0 )) > 0 ) { printf("recv_buf: %s\n" , recv_buf); send(connfd, recv_buf, recv_len, 0 ); } printf("client_port %d closed!\n" , ntohs(client_addr.sin_port)); close(connfd); exit(0 ); } else if (pid > 0 ){ close(connfd); } } close(sockfd); return 0 ; } 運行結果:
總結
以上是生活随笔 為你收集整理的Linux网络编程——tcp并发服务器(多进程) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。