多線程并發服務器

代碼:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h> 
#define PORT 6666   //1024~49151
#define IP "192.168.122.130"  //ifconfig查看本機IP
#include <pthread.h>
//需要傳入分之線程的數據類型
struct Climsg
{int newfd;struct sockaddr_in cin;
};
void *deal_cli_msg(void *arg);
int main(int argc, const char *argv[])
{//創建流式套接字int sfd = socket(AF_INET,SOCK_STREAM,0);if(sfd < 0){ERRO_MES("socket");return -1;}printf("sfd = %d\n",sfd);//綁定服務器的IP和端口--->必須綁定//填充地址信息結構體,真實的地址信息結構體根據地質族制定//AF_INET: man 7 ip;struct sockaddr_in sin;sin.sin_family = AF_INET;//必須填AF_INET;sin.sin_port = htons(PORT);  //端口號:1024~49151;sin.sin_addr.s_addr = inet_addr(IP);  //本機IP ifconfig查看;if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin)) < 0){ERRO_MES("bind");return -1;}printf("bind success\n");//將套接字設置為被動監聽狀態if(listen(sfd,10) < 0){ERRO_MES("listen");return -1;}printf("listen success\n");//設置允許端口號被快速復用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERRO_MES("setsockopt");return -1;}printf("允許端口快速重用成功\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){ERRO_MES("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,(void *)&info) != 0){fprintf(stderr,"pthread_create failed __%d__",__LINE__);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){ERRO_MES("recv");break;}else if(0 == res){printf("[%s : %d]  newfd = %d,客戶下線\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);break;}printf("newfd :%d\t buf = %s\n",newfd,buf);//發送數據strcat(buf,"----");if(send(newfd,buf,sizeof(buf),0) < 0){ERRO_MES("send");break;}printf("send success\n");}close(newfd);pthread_exit(NULL);
}

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

答:不能修改成全局;

當使用全局變量時,線程中的newfd會發生覆蓋;

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

答:不能

?現象表明,線程中的newfd會發生覆蓋,只保留最后一次newfd的值

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

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

相關文章

深入解析:HTTP和HTTPS的三次握手與四次揮手

推薦閱讀 AI文本 OCR識別最佳實踐 AI Gamma一鍵生成PPT工具直達鏈接 玩轉cloud Studio 在線編碼神器 玩轉 GPU AI繪畫、AI講話、翻譯,GPU點亮AI想象空間 「java、python面試題」來自UC網盤app分享&#xff0c;打開手機app&#xff0c;額外獲得1T空間 https://drive.uc.cn/…

探索Python編程的技巧:多線程魔法、網絡舞臺、正則魔法陣與遞歸迷宮

一 多線程 1.1 進程和線程 進程&#xff1a; 就是一個程序&#xff0c;運行在系統之上&#xff0c;稱這個程序為一個運行進程&#xff0c;并分配進程ID方便系統管理。線程&#xff1a;線程是歸屬于進程的&#xff0c;一個進程可以開啟多個線程&#xff0c;執行不同的工作&…

【C++面向對象】--- 繼承 的奧秘(下篇)

個人主頁&#xff1a;平行線也會相交&#x1f4aa; 歡迎 點贊&#x1f44d; 收藏? 留言? 加關注&#x1f493;本文由 平行線也會相交 原創 收錄于專欄【C之路】&#x1f48c; 本專欄旨在記錄C的學習路線&#xff0c;望對大家有所幫助&#x1f647;? 希望我們一起努力、成長&…

Vim基本使用

Vim基本使用 概念模式類型常規模式編輯模式命令模式 概念 vim 是一款功能豐富、高度可定制和高效的文本編輯器&#xff0c;適用于處理各種文本文件和編程任務。熟練使用vim幫助提高編輯效率&#xff0c;并為用戶提供更多的操作選項。 模式類型 常規模式 使用vim打開一個文件…

Postman接口自動化測試實戰,從0到1一篇徹底打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 postman中的測試 …

【網絡基礎】傳輸層

【網絡基礎】傳輸層 文章目錄 【網絡基礎】傳輸層1、端口號1.1 工具 2、UDP協議2.1 協議端格式2.2 UDP特點2.3 傳輸數據報2.4 緩沖區2.5 基于UDP應用層協議2.6 使用注意事項 3、TCP協議3.1 協議段格式3.2 ACK機制3.3 超時重傳機制3.4 連接管理機制3.5 滑動窗口3.6 流量控制3.7 …

207、仿真-51單片機脈搏心率與血氧報警Proteus仿真設計(程序+Proteus仿真+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、程序源碼 資料包括&#xff1a; 需要完整的資料可以點擊下面的名片加下我&#xff0c;找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選擇 方案一&a…

猿輔導Motiff與IXDC達成戰略合作,將在UI設計領域推動AI革新更多可能性

近日&#xff0c;“IXDC 2023國際體驗設計大會”在北京國家會議中心拉開序幕&#xff0c;3000設計師、1000企業、200全球商業領袖&#xff0c;共襄為期5天的用戶體驗創新盛會。據了解&#xff0c;此次大會是以“設計領導力”為主題&#xff0c;分享全球設計、科技、商業的前沿趨…

報錯解決:matlab機器人工具箱不支持將腳本 DHFactor 作為函數執行

matlab使用機器人工具箱出現報錯&#xff1a; 不支持將腳本 DHFactor 作為函數執行: D:\MATLAB\install\toolbox\rvctools\robot\DHFactor.m 解決辦法&#xff1a;重新到上圖的rvctool重重新安裝一下工具箱就好了。 到目錄"$機器人工具箱路徑$\rvctools" 在matlab命…

使用Scanner接收用戶輸入

掃描輸入的兩種方式 Scanner主要提供了兩個方法來掃描輸入&#xff1a; &#xff08;1&#xff09;hasNextXxx()&#xff1a;是否還有下一個輸入項&#xff0c;Xxx可以是Int&#xff0c;Long等代表基本數據類型的字符串。 如果只是判斷是否包含下一個字符串&#xff0c;則直…

新手開抖店多久可以出單?

?開抖店是一種越來越流行的創業方式&#xff0c;在社交媒體平臺上開店銷售各種商品&#xff0c;比如服裝、配飾、美妝和家居用品等等。對于新手來說&#xff0c;他們可能會很關心自己開抖店能夠多久出單。雖然這個問題沒有一個固定的答案&#xff0c;但是以下是一些關鍵的運營…

【boost網絡庫從青銅到王者】第三篇:asio網絡編程中的buffer緩存數據結構

文章目錄 1、關于buffer數據結構1.1、簡單概括一下&#xff0c;我們可以用buffer() 函數生成我們要用的緩存存儲數據。1.2、但是這太復雜了&#xff0c;可以直接用buffer函數轉化為send需要的參數類型:1.3、output_buf可以直接傳遞給該send接口。我們也可以將數組轉化為send接受…

docker發展歷史

docker 一、docker發展歷史很久以前2013年2014年2015年2016年2017年2018年2019年及未來 二、 docker概述定義&#xff1a;docker底層運行原理:docker簡述核心概念容器特點Docker與虛擬機的區別: 三、容器在內核中支持兩種重要技術四、namespace的六項隔離五、虛擬化產品有哪些1…

CAS 的執行流程 ?CAS 中 ABA 問題如何解決 ?CAS 在 Java 中有哪些實現類 ?

目錄 1. CAS 的執行流程 2. CAS 中的 ABA 問題 3. 如何解決 CAS 中的 ABA 問題 4.CAS 在Java 中的實現類有哪些 1. CAS 的執行流程 CAS 比較并替換的大致流程是這樣的&#xff1a; 它有三個操作單位&#xff1a;V&#xff08;內存值&#xff09;&#xff0c;A&#xff08;…

3D沉浸式旅游網站開發案例復盤【Three.js】

Plongez dans Lyon網站終于上線了。 我們與 Danka 團隊和 Nico Icecream 共同努力&#xff0c;打造了一個令我們特別自豪的流暢的沉浸式網站。 這個網站是專為 ONLYON Tourism 和會議而建&#xff0c;旨在展示里昂最具標志性的活動場所。觀看簡短的介紹視頻后&#xff0c;用戶…

Android 面試筆記整理-Binder機制

作者&#xff1a;浪人筆記 面試可能會問到的問題 從IPC的方式問到Binder的優勢為什么zygote跟其他服務進程的通訊不使用BinderBinder線程池和Binder機制 等等這些問題都是基于你對Binder的理解還有對其他IPC通訊的理解 IPC方式有多少種 傳統的IPC方式有Socket、共享內存、管道…

llvm-dyn_cast模板函數

dyn_cast dyn_cast是LLVM中用于執行安全的向下轉型&#xff08;downcasting&#xff09;的一個模板函數。在C中&#xff0c;向下轉型是將基類的指針或引用轉換為派生類的指針或引用。這種轉型在運行時進行&#xff0c;如果轉型失敗&#xff08;即&#xff0c;如果基類的對象實…

云計算虛擬仿真實訓平臺

一、云計算虛擬仿真系統概述 云計算虛擬仿真系統是一種基于云計算技術和虛擬化技術的系統&#xff0c;用于實現各種仿真和模擬任務。它可以提供強大的計算能力和資源管理&#xff0c;為用戶提供靈活、高效、可擴展的仿真環境。 該系統通常由一組服務器、網絡和存儲設備組成&am…