代码实现
1、服务器端
/*tcpserver.c 2011.9.1 by yyg*/ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys> #include <netinet> #include <sys> #include <sys> #include <pthread.h> #define MYPORT 3490 //定义端口 #define BACKLOG 10 #define MAXDATASIZE 1024 int sockfd,new_fd; pthread_t accthread,recthread; void recmessage(void){ //接收客户端信息函数 while(1){ int numbytes; char buf[MAXDATASIZE]; if((numbytes = recv(new_fd,buf,MAXDATASIZE,0))==-1){ perror("recv"); exit(1); } buf[numbytes]='\0'; if(strcmp(buf,"exit")==0){ //若收到的是exit字符,则代表退出通信 printf("Client is closed\n"); close(new_fd); close(sockfd); exit(1); } printf("client:%s\n",buf); }/*while*/ } void acceptconnect(void){ //接受客户端连接请求函数 struct sockaddr_in their_addr; int sin_size; sin_size = sizeof(struct sockaddr_in); if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1){ perror("accept"); exit(1); } printf("server:got connection from %s\n",inet_ntoa(their_addr.sin_addr)); /*创建子线程,用于接收信息*/ if((pthread_create(&recthread,NULL,(void*)recmessage,NULL)) != 0){ printf("create thread error!\r\n"); exit(1); } } int main(void){ struct sockaddr_in my_addr; /*创建套接字*/ if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ perror("socket"); exit(1); } /*初始化sockaddr_in结构体相关参数*/ my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); /*绑定端口与套接字*/ if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){ perror("bind"); exit(1); } /*监听客户端套接字*/ if(listen(sockfd,BACKLOG)== -1){ perror("listen"); exit(1); } printf("listening...\n"); /*创建子线程,用于接收信息*/ if((pthread_create(&accthread,NULL,(void*)acceptconnect,NULL))!=0){ printf("create thread error!\n"); exit(1); } while(1){ char msg[MAXDATASIZE]; scanf("%s",msg); if(send(new_fd,msg,strlen(msg),0) == -1){ //发送信息,与客户端交流 perror("send"); exit(1); } if(strcmp(msg,"exit") ==0){ printf("byebye\n"); close(new_fd); close(sockfd); exit(1); } }/*while*/ return 0; }/*main*/</pthread.h></sys></sys></netinet></sys></string.h></errno.h></stdlib.h></stdio.h>
2.客户端
/*tcpclient.c 2010.9.1 by yyg*/ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys> #include <netinet> #include <sys> #include <sys> #include <pthread.h> #include <netdb.h> #define PORT 3490 #define BACKLOG 10 #define MAXDATASIZE 1024 int sockfd; pthread_t recthread; /*接收信息函数*/ void recmessage(void){ while(1){ int numbytes; char buf[MAXDATASIZE]; if((numbytes = recv(sockfd,buf,MAXDATASIZE,0))==-1){ perror("recv"); exit(1); } buf[numbytes]='\0'; if(strcmp(buf,"exit")==0){ printf("Server is closed\n"); close(sockfd); exit(1); } printf("Server:%s\n",buf); }/*while*/ } int main(int argc,char *argv[]){ struct hostent *he; struct sockaddr_in their_addr; /*客户端输入方式:./client 172.31.100.236,若无输入后面IP地址,会提示错误*/ if(argc != 2){ fprintf(stderr,"usage:client hostname\n"); exit(1); } /*获取主机IP地址*/ if((he = gethostbyname(argv[1])) == NULL){ herror("gethostbyname"); exit(1); } /*创建套接字*/ if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ perror("socket"); exit(1); } /*初始化sockaddr_in结构体*/ their_addr.sin_family = AF_INET; their_addr.sin_port = htons(PORT); their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero),8); /*向服务器发送连接请求*/ if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ perror("connect"); exit(1); } /*创建子线程,用于接收信息*/ if((pthread_create(&recthread,NULL,(void*)recmessage,NULL))!= 0){ printf("create thread error!\r\n"); exit(1); } /*发送信息。接收发送信息用的是同一端口,都 是sockfd*/ while(1){ char msg[MAXDATASIZE]; scanf("%s",msg); if(send(sockfd,msg,strlen(msg),0) == -1){ perror("send"); exit(1); } if(strcmp(msg,"exit") ==0){ printf("byebye\n"); close(sockfd); exit(1); } }/*while*/ return 0; }</netdb.h></pthread.h></sys></sys></netinet></sys></string.h></errno.h></stdlib.h></stdio.h>
运行结果:
终端1:
[root@localhost net]# ./tcpserver server:got connection from 172.31.100.236 Hello,World! client:hello client:xiaolian client:iou ok exit byebye
终端2:
[root@localhost net]# ./tcpclient 172.31.100.236 Server:Hello,World! hello xiaolian iou Server:ok Server is closed
以上是linux socket怎麼實作使用執行緒獨立收發訊息的詳細內容。更多資訊請關注PHP中文網其他相關文章!

在Linux中,文件和目錄管理使用ls、cd、mkdir、rm、cp、mv命令,權限管理使用chmod、chown、chgrp命令。 1.文件和目錄管理命令如ls-l列出詳細信息,mkdir-p遞歸創建目錄。 2.權限管理命令如chmod755file設置文件權限,chownuserfile改變文件所有者,chgrpgroupfile改變文件所屬組。這些命令基於文件系統結構和用戶、組系統,通過系統調用和元數據實現操作和控制。

MaintenancemodeInuxisAspecialBootenvironmentforforcalsystemmaintenancetasks.itallowsadMinistratorStoperFormTaskSlikerSettingPassingPassingPasswords,RepairingFilesystems,andRecoveringFrombootFailuresFailuresFailuresInamInimAlenimalenimalenrenmentrent.ToEnterMainterMainterMaintErmaintErmaintEncemememodeBoode,Interlecttheboo

Linux的核心組件包括內核、文件系統、Shell、用戶空間與內核空間、設備驅動程序以及性能優化和最佳實踐。 1)內核是系統的核心,管理硬件、內存和進程。 2)文件系統組織數據,支持多種類型如ext4、Btrfs和XFS。 3)Shell是用戶與系統交互的命令中心,支持腳本編寫。 4)用戶空間與內核空間分離,確保系統穩定性。 5)設備驅動程序連接硬件與操作系統。 6)性能優化包括調整系統配置和遵循最佳實踐。

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

Linux的維護模式可以通過GRUB菜單進入,具體步驟為:1)在GRUB菜單中選擇內核並按'e'編輯,2)在'linux'行末添加'single'或'1',3)按Ctrl X啟動。維護模式提供了一個安全環境,適用於系統修復、重置密碼和系統升級等任務。

進入Linux恢復模式的步驟是:1.重啟系統並按特定鍵進入GRUB菜單;2.選擇帶有(recoverymode)的選項;3.在恢復模式菜單中選擇操作,如fsck或root。恢復模式允許你以單用戶模式啟動系統,進行文件系統檢查和修復、編輯配置文件等操作,幫助解決系統問題。

Linux的核心組件包括內核、文件系統、Shell和常用工具。 1.內核管理硬件資源並提供基本服務。 2.文件系統組織和存儲數據。 3.Shell是用戶與系統交互的接口。 4.常用工具幫助完成日常任務。

Linux的基本結構包括內核、文件系統和Shell。 1)內核管理硬件資源,使用uname-r查看版本。 2)EXT4文件系統支持大文件和日誌,使用mkfs.ext4創建。 3)Shell如Bash提供命令行交互,使用ls-l列出文件。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3漢化版
中文版,非常好用

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),