【0814作業】多線程并發服務器

1) 代碼

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <head.h>
#include <pthread.h>#define PORT 6666               //1024-49151
#define IP "192.168.1.102"    //ifconfig查看本機ip//需要傳入到分支線程的數據類型
struct CliMsg
{int newfd;struct sockaddr_in cin;
};void *deal_cli_msg(void *arg);
void handlr(int sig)
{while(waitpid(-1,NULL,WNOHANG) > 0);
}int main(int argc, const char *argv[])
{if(signal(17,handlr) == SIG_ERR){ERR_MSG("signal");return -1;}//創建流式套接字int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd < 0){ERR_MSG("socket");return -1;}printf("sfd= %d\n",sfd);                                                                                                    //設置端口允許端口被快速復用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允許端口快速重用成功\n");//填充地址信息結構體,真實的地址信息結構體根據地址族制定//AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family         = AF_INET;       //必須填AF_INETsin.sin_port           = htons(PORT);   //端口號:1024~49151(網絡端口號的字節序)(端口號存儲在2個字節的無符號整數中)sin.sin_addr.s_addr    = inet_addr(IP); //本機IP inconfig查看(本機IP地址的字節序)//綁定服務器的IP和端口號--->必須綁定( bind )if(bind(sfd , (struct sockaddr*)&sin, sizeof(sin)) < 0){ERR_MSG("bind");return -1;}printf("bind success\n");//將套接字設置為被動監聽狀態( listen)if(listen(sfd,128) < 0){ERR_MSG("listen");return -1;}printf("listen success\n");struct sockaddr_in cin;   //存儲客戶端的地址信息socklen_t addrlen = sizeof(cin);int newfd = -1;pthread_t tid;struct CliMsg info;while(1){newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){ERR_MSG("accept");return -1;}printf("[%s : %d]newfd=%d 客戶端連接成功\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);info.newfd = newfd;info.cin=cin;if(pthread_create(&tid,NULL,deal_cli_msg,&info) != 0){ERR_MSG("pthread_create");return -1;}pthread_detach(tid);}//關閉所有文件描述符close(sfd);return 0;
}
//線程執行體
void* deal_cli_msg(void *arg)
{int newfd = ((struct CliMsg *)arg)->newfd;struct sockaddr_in cin = ((struct CliMsg *)arg)->cin;char buf[128]="";ssize_t res = 0;while(1){//接收數據bzero(buf,sizeof(buf));res=recv(newfd,buf,sizeof(buf),0);if(res < 0){ERR_MSG("recv");break;}else if(0 == res){printf("[%s : %d]newfd=%d 客戶端已下線\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);break;}printf("[%s : %d]newfd=%d : %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd, buf);//發送數據strcat(buf,"*_*");if(send(newfd,buf,sizeof(buf),0) < 0){ERR_MSG("send");return NULL;}printf("send succuss\n");}close(newfd);pthread_exit(NULL);
}

2)?多線程中的newfd,能否修改成全局,為什么?

不行。因為同屬于一個進程下的線程,共享其附屬進程的所有資源。代碼中的newfd和cin(用于存儲客戶端的信息)是臨界資源,當有新的客戶端連接之后,將會覆蓋之前的文件描述符和客戶端的地址信息,導致收發對象會出現錯誤。

3)?多線程中分支線程的newfd能否不另存,直接用指針間接訪問主線程中的newfd,為什么?

不行。與上一道題一樣,同屬于一個進程下的線程,共享其附屬進程的所有資源。當指針指向變量,將指針指向的值修改,原本變量內的值也會隨之改變。并不是另存一個值,而是修改了原本的值。

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

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

相關文章

配置文件優先級解讀

目錄 概述 同級目錄application配置文件優先級 application 以及bootstrap 優先級 不同級目錄配置文件優先級 外部配置加載順序 概述 SpringBoot除了支持properties格式的配置文件&#xff0c;還支持另外兩種格式的配置文件。三種配置文件格式分別如下: properties格式…

Python學習筆記_基礎篇(二)_數據類型之字符串

一.基本數據類型 整數&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一個tab鍵) 布爾值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的數據類型都存在想對應…

TFTP Server

簡介 TFTP&#xff08;Trivial File Transfer Protocol,簡單文件傳輸協議&#xff09;是TCP/IP協議族中的一個用來在客戶機與服務器之間進行簡單文件傳輸的協議&#xff0c;提供不復雜、開銷不大的文件傳輸服務。端口號為69。 TFTP和FTP的區別 安全性區別 FTP支持登錄安全&…

ATF(TF-A)安全通告 TFV-9 (CVE-2022-23960)

ATF(TF-A)安全通告匯總 目錄 一、ATF(TF-A)安全通告 TFV-9 (CVE-2022-23960) 二、CVE-2022-23960 一、ATF(TF-A)安全通告 TFV-9 (CVE-2022-23960) Title TF-A披露通過分支預測目標重用&#xff08;branch prediction target reuse&#xff09;引發的前瞻執行處理器漏洞 CV…

Softmax Strategy

1. epsilon-greedy strategy 11111 2. UCB strategy 222 3. Softmax strategy 333 4. Gradient strategy 444 References [1] 科學網—【RL系列】Multi-Armed Bandit筆記——Softmax選擇策略 - 管金昱的博文 [2] The Epsilon-Greedy Algorithm | James D. McCaffrey

【軟考】2023系統架構設計師考試

目錄 1 軟考資格設置 2 考試報名 3 考試準備 4 參加考試 5 考試感受 6 其他 1 軟考資格設置 2 考試報名 報名網址&#xff1a;https://www.ruankao.org.cn/ 3 考試準備 4 參加考試 2023年下半年系統架構設計師考試時間為11月4、5日。 5 考試感受 6 其他 最近好像有地區…

vue element 多圖片組合預覽

定義組件&#xff1a;preview-image <template><div><div class"imgbox"><divclass"preview-img":class"boxClass"v-if"Imageslist 3 ||Imageslist 5 ||Imageslist 7 ||Imageslist 8 ||Imageslist > 9"&…

LangChain手記 Models,Prompts and Parsers

整理并翻譯自DeepLearning.AILangChain的官方課程&#xff1a;Models,Prompts and Parsers 模型&#xff0c;提示詞和解析器&#xff08;Models, Prompts and Parsers&#xff09; 模型&#xff1a;大語言模型提示詞&#xff1a;構建傳遞給模型的輸入的方式解析器&#xff1a;…

即時編譯的觸發

文章目錄 Java即時編譯:概述Java即時編譯:原理Java即時編譯:優點提高程序的運行效率動態優化高效利用CPU資源Java即時編譯:案例分析Java即時編譯:概述 Java語言一直是業界公認的高級編程語言,在眾多編程語言中獨樹一幟。Java的JVM(Java虛擬機)是Java語言的核心所在,它…

即將發布的 Kibana 版本可運行 Node.js 18

作者&#xff1a;Thomas Watson Kibana 構建在 Node.js 框架之上。 為了確保每個 Kibana 版本的穩定性和使用壽命&#xff0c;我們始終將捆綁的 Node.js 二進制文件保持為最新的最新長期支持 (LTS) 版本。 當 Node.js 版本 18 升級到 LTS 時&#xff0c;我們開始將 Kibana 升級…

如何理解“對矩陣進行初等行變換不改變其列向量的線性關系”?

對矩陣A進行初等行變換相當于左乘一個可逆矩陣P。 把A看作是列向量組&#xff0c;若有Ax0&#xff0c;則其中的x就說明了列向量的線性關系&#xff1a; [ α 1 , α 2 , α 3 ] [ x 1 x 2 x 3 ] [ 0 ] \left[ \alpha_1 ,\alpha_2, \alpha_3 \right] \begin{bmatrix} x_1\\ x…

【爬蟲】爬取旅行評論和評分

以馬蜂窩“普達措國家公園”為例&#xff0c;其評論高達3000多條&#xff0c;但這3000多條并非是完全向用戶展示的&#xff0c;向用戶展示的只有5頁&#xff0c;數了一下每頁15條評論&#xff0c;也就是75條評論&#xff0c;有點太少了吧&#xff01; 因此想了個辦法盡可能多爬…

【 BERTopic應用 02/3】 分析卡塔爾世界杯推特數據

攝影&#xff1a;Fauzan Saari on Unsplash 一、說明 這是我們對世界杯推特數據分析的第3部分&#xff0c;我們放棄了。我們將對我們的數據進行情緒分析&#xff0c;以了解人們對卡塔爾世界杯的感受。我將在這里介紹的一個功能強大的工具包是Hugging Face&#xff0c;您可以在…

高憶管理:策略:短期利空落地 市場有望企穩回升

高憶管理指出&#xff0c;基于A股商場出資環境分析&#xff0c;尤其是當時商場存量博弈為主的布景下&#xff0c;主張重視以下“21”主線輪動&#xff1a;&#xff08;1&#xff09;國產科技代替立異&#xff1a;電子&#xff08;半導體、消費電子&#xff09;、通信&#xff0…

Vue基本知識

一、vue入門 Vue為前端的框架&#xff0c;免除了原生js的DOM操作。簡化書寫。 基于MVVM的思想&#xff0c;實現數據的雙向綁定&#xff0c;使編程的重點放在數據上。 1、引入vue.js文件 2、定義vue核心對象&#xff0c;定義數據模型 3、編寫視圖 //1、引入vue.js <scr…

關于vue,記錄一次修飾符.stop和.once的使用,以及猜想。

內置指令 | Vue.js 在vue的api里&#xff0c;關于v-on有stop和once兩個事件標簽。 .stop - 調用 event.stopPropagation()。.once - 最多觸發一次處理函數。 原有主要代碼和頁面效果 &#xff08;無stop和once&#xff09;: ...<div class"div" click"di…

激活函數總結(九):Softmax系列激活函數補充(Softmin、Softmax2d、Logsoftmax)

激活函數總結&#xff08;九&#xff09;&#xff1a;Softmax系列激活函數補充 1 引言2 激活函數2.1 Softmin激活函數2.2 Softmax2d激活函數2.3 Logsoftmax激活函數 3. 總結 1 引言 在前面的文章中已經介紹了介紹了一系列激活函數 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、S…

React+Typescript清理項目環境

上文 創建一個 ReactTypescript 項目 我們創建出了一個 React配合Ts開發的項目環境 那么 本文 我們先將環境清理感覺 方便后續開發 我們先來聊一下React的一個目錄結構 跟我們之前開發的React項目還是有一些區別 public 主要是存放一些靜態資源文件 例如 html 圖片 icon之類的 …

響應式設計是什么?怎么學習? - 易智編譯EaseEditing

響應式設計是一種用于創建能夠適應不同設備和屏幕尺寸的網站和應用程序的設計方法。它的目標是確保網站在各種設備上都能提供良好的用戶體驗&#xff0c;無論是在大屏幕的桌面電腦上還是在小屏幕的移動設備上。 在響應式設計中&#xff0c;頁面的布局、字體、圖像和其他元素會…

【yml文件的解釋】

目錄 一、yml的簡介二、手寫yml文件進行配置三、使用yaml格式導出生成模板四、deployment.yaml文件詳解五、Pod yaml文件詳解六、Service yaml文件詳解 一、yml的簡介 Kubernetes 支持 YAML 和 JSON 格式管理資源對象 JSON 格式&#xff1a;主要用于 api 接口之間消息的傳遞 Y…