TCP多進程并發服務端 Linux socket編程入門(2)

這里很簡單的使用了fork()函數,在執行了fork()以后的所有代碼都會由子進程和父進程同時執行。

他們同時擁有相同的資源(兩份拷貝),所以在子進程執行的過程中,子進程需要先close掉listenfd(監聽套接字),以免過多占用系統資源。

而父進程繼續監聽listenfd,如果有新的連接出現,則會再次添加一個子進程。

這個tcp服務端的功能也是十分簡單,就是將客戶端的消息,原封不動地發回去。

?

代碼如下

#include "socket_includes.h"int create_socket();
int process_data(int sockfd);int main(int argc,char **argv)  
{  struct sockaddr_in cliaddr;int  sockfd, listenfd;int cli_addr_len;printf("My pid is %d\n",getpid());listenfd = create_socket();if(listenfd < 0){printf("create_socket err\n");return -1;}for(;;){cli_addr_len = sizeof(cliaddr);sockfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cli_addr_len);if(sockfd < 0){printf("accept err:\n");continue;}if(fork() == 0){//就是這里!新建了一個子進程。close(listenfd);//子進程關閉不要用的套接字。父進程沒有關閉,他們是兩套拷貝printf("My pid is %d\n",getpid());  //打印PIDprocess_data(sockfd); //數據處理的過程我用函數打包了一下exit(0);}close(sockfd);  //子進程和父進程都會關閉sockfd}close(listenfd);return 0;  
}  int process_data(int sockfd){int bytes, err;char buff[MAX_BUFF_LINE];printf("產生了一個新的客戶連接\n");for(;;){bytes = recv(sockfd,buff, MAX_BUFF_LINE, 0);if(bytes < 0){printf("recv err:\n");continue;}buff[bytes] = '\0';if(!strcmp(buff, "q")){printf("客戶連接退出了!\n");err = send(sockfd, "quit!\n", strlen("quit!\n"), 0);close(sockfd);exit(0);		}printf("%s", buff);	err = send(sockfd, buff, bytes, 0);if(err < 0){printf("send err:\n");continue;}}
}int create_socket(){int listenfd, err;int ser_addr_len;struct sockaddr_in servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);if(listenfd < 0){printf("socket err:");return -1;	}//清零IP地址結構體bzero(&servaddr, sizeof(servaddr));//填寫必要的信息servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);ser_addr_len = sizeof(servaddr);err = bind(listenfd, (struct sockaddr *)&servaddr, ser_addr_len);if(err < 0){printf("bind err:");return -1;}err = listen(listenfd, 10);if(err < 0){printf("listen err:");return -1;	}printf("listen the port:%d\n", PORT);  return listenfd;
}

  

? 頭文件"socket_includes.h"的內容是:

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/socket.h>  
#include<sys/types.h>  
#include<unistd.h>  
#include<netinet/in.h>  
#include <errno.h>    #define MAX_BUFF_LINE 100
#define PORT 9999  

  

轉載于:https://www.cnblogs.com/sunfishgao/p/4969341.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcEngine 打開shape文件

IWorkspaceFactory wsf new ShapefileWorkspaceFactory(); IWorkspace pWorkspace wsf.Open(filePath, 0) ;//filePath為shapefile所在的文件夾 IFeatureWorkspace pFeatureWorkspace pWorkspace ; IFeatureClass pFeatureClass pFeatureWorkspace.OpenFeatureClass(&quo…

Win32ASM學習[10]:傳送指令

匯編指令的一般性要求: 1、兩個操作數的尺寸必須一致; 2、操作數不能同為內存. --------------------------------------------------------------------------------------------------------------- ;mov ;該指令不影響 EFlags ;指令格式: (其中的 r、m、i 分別表示: 寄存器、…

SQL Server 中關于 @@error 的一個小誤區

SQL Server 中關于 error 的一個小誤區 原文:SQL Server 中關于 error 的一個小誤區在SQL Server中&#xff0c;我常常會看到有些前輩這樣寫&#xff1a; if(error<>0)ROLLBACK TRANSACTION T elseCOMMIT TRANSACTION T 一開始&#xff0c;我看見別人這么寫&#xff0c;我…

Win32ASM學習[11]:邏輯運算

--------------------------------------------------------------------------------------------------------------------------- 一.邏輯與運算指令 AND 格式: AND OPRD1,OPRD2其中目的操作數OPRD1為任一通用寄存器或存儲器操作數.源操作數OPRD2為立即數、任一通用寄存器…

JavaScript消息框

1.警告框 function myTest(){alert("這里的內容會彈出");} 2.確認框 其返回的值是 true 或 false 。 function myTest(){confirm("這里的內容會彈出");} 3.提示框 prompt prompt(參數1&#xff0c;參數2)&#xff1a;其參數1 是顯示提示要輸入的信息&…

.Net 事務

在分布式應用程序中&#xff0c;不可避免地會經常使用到事務控制。事務有一個開頭和一個結尾&#xff0c;它們指定了事務的邊界&#xff0c;事務在其邊界之內可以跨越進程和計算機。事務邊界內的所有資源都參與同一個事務。要維護事務邊界內資源間的一致性&#xff0c;事務必須…

Win32ASM學習[12]:位測試指令位掃描指令

----------------------------------------------------------------------------------------------------------------------- 一.BT 指令 格式: BT OPD,OPS 功能: 目的操作數OPD中由源操作數OPS指定的位送CF標志 說明: 1. 在指令中,目的操作數OPD只能是16/32位通用寄存器…

Android WifiDisplay分析一:相關Service的啟動

網址&#xff1a;http://www.2cto.com/kf/201404/290996.html 最近在學習Android 4.4上面的WifiDisplay(Miracast)相關的模塊&#xff0c;這里先從WifiDisplay用到的各個Service講起&#xff0c;然后再從WifiDisplaySettings里面講解打開wfd的流程。首先看下面的主要幾個Servic…

mvc controller跳轉頁面方法

1、直接Redirect后加 Controller/Action Response.Redirect("/User/Edit"); // return Redirect("/User/Edit"); return RedirectToAction("about","Home"); Response.Redirect("/User/Edit"); 2、直接r…

Win32ASM學習[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD

一. SHL、SHR、SAL、SAR: 移位指令 ---------------------------------------------------------------------------------------------------- ;SHL(Shift Left): 邏輯左移 ;SHR(Shift Right): 邏輯右移 ;SAL(Shift Arithmetic Left): 算術左移 ;SAR(Shift Ari…

angular中的表單驗證

angular中的表單驗證很強大&#xff0c; 一共有5中驗證信息&#xff0c;$valid,$invalid,$pristine,$dirty,$error. $valid-----當驗證通過的時候&#xff0c;為true,不通過的時候為false $invalid----當驗證不通過的時候&#xff0c;為true&#xff0c;通過的時候為true $pris…

Cortex-A15 Memory Hierarchy

ARM 平臺為實現速度和成本的平衡&#xff0c;使用多個層次的內存架構。對于多核 CPU 組成的 SOC&#xff0c;每個CPU 內部都有一組高速緩存&#xff0c;包含&#xff1a;ICache、DCache 和 TLB。多個 CPU 共享一個更大的 L2 緩存。L2緩存再和 CPU 外部的DDR3 內存交互。ICache …

Win32ASM學習[14]:符號擴展指令: CBW,CWDE,CDQ,CWD

----------------------------------------------------------------------------------------------------------------------------------------------------------------- ;CBW(Convert Byte to Word): 將 AL 擴展為 AX ;CWDE(Convert Word to Extended Double): 將 …

Win32ASM學習[15]:加減指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;INC(Increment): 加一 ;DEC(Decrement): 減一 ;NEG(Negate): 求補(求反) ;ADD(Add): 加 ;A…

UINavigationController的簡單使用

UINavigationController的使用步驟初始化UINavigationController設置UIWindow的rootViewController為UINavigationController根據具體情況&#xff0c;通過push方法添加對應個數的子控制器UINavigationController的子控制器UINavigationController以棧的形式保存子控制器proper…

Android 圖片的縮略圖

<1>簡介 之前往往是通過Bitmap、Drawable和Canvas配合完成&#xff0c;需要寫一系列繁雜的邏輯去縮小原有圖片&#xff0c;從而得到縮略圖。 現在我給大家介紹一種比較簡單的方法&#xff1a;&#xff08;網上有&#xff09; 在Android 2.2版本中&#xff0c;新增了一個T…

Win32ASM學習[16] :乘除指令: MUL、IMUL、DIV、IDIV

---------------------------------------------------------------------------------------------------------------------------------------------------------------------- 一. 無符號數乘法指令 MUL(MULtiply) 格式: MUL OPRD 功能: 乘法操作. 說明: 1. OPRD為通用…

Linux命令之man

一、引言 一直聽別人說linux下有個男人很厲害&#xff0c;遇到不會的不懂的都可以問他&#xff0c;自己也會幾個man命令&#xff0c;但是一直不知道到底man命令是怎么用的&#xff0c;比如查詢不同類的幫助該在man后跟數字幾&#xff0c;man后的數字有什么具體的意思&#xff0…

《JavaScript權威指南》學習筆記 第二天 下好一盤大棋

前段學習js的時候總是零零散散的&#xff0c;以至于很多東西都模棱兩可。時間稍微一久&#xff0c;就容易忘記。最主要的原因是這些東西&#xff0c;原來學的時候就不是太懂&#xff0c;以至于和其他知識無法形成記憶鏈&#xff0c;所以孤零零的知識特別容易忘記。重溫犀牛書&a…

Win32ASM學習[17]:條件跳轉

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 一.跳轉相關的標志位: 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF Z…