利用多線程實現linux下C語言的聊天室程序:

轉載:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml

利用多線程實現linux下C語言的聊天室程序:

客戶端代碼:

threadsend線程負責客戶端消息的發送;

threadrecv線程負責客戶端接受服務器端的消息。

[html]?view plain?copy
  1. #include?<stdlib.h>??
  2. #include?<stdio.h>??
  3. #include?<errno.h>??
  4. #include?<string.h>??
  5. #include?<unistd.h>??
  6. #include?<netdb.h>??
  7. #include?<sys/socket.h>??
  8. #include?<netinet/in.h>??
  9. #include?<sys/types.h>??
  10. #include?<arpa/inet.h>??
  11. #include?<pthread.h>??
  12. ??
  13. #define?MAXLINE?100;??
  14. void?*threadsend(void?*vargp);??
  15. void?*threadrecv(void?*vargp);??
  16. ??
  17. int?main()??
  18. {??
  19. ??
  20. int?*clientfdp;??
  21. clientfdp?=?(int?*)malloc(sizeof(int));??
  22. *clientfdp?=?socket(AF_INET,SOCK_STREAM,0);??
  23. struct?sockaddr_in?serveraddr;??
  24. struct?hostent?*hp;??
  25. bzero((char?*)&serveraddr,sizeof(serveraddr));??
  26. serveraddr.sin_family?=?AF_INET;??
  27. serveraddr.sin_port?=?htons(15636);??
  28. serveraddr.sin_addr.s_addr?=?inet_addr("127.0.0.1");??
  29. if(connect(*clientfdp,(struct?sockaddr?*)&serveraddr,sizeof(serveraddr))?<?0){??
  30. ????????printf("connect?error\n");??
  31. ????????exit(1);??
  32. }??
  33. ??
  34. pthread_t?tid1,tid2;??
  35. printf("connected\n");??
  36. while(1){??
  37. pthread_create(&tid1,NULL,threadsend,clientfdp);??
  38. ??
  39. pthread_create(&tid2,NULL,threadrecv,clientfdp);??
  40. }??
  41. ??
  42. return?EXIT_SUCCESS;??
  43. }??
  44. ??
  45. void?*threadsend(void?*?vargp)??
  46. {??
  47. //pthread_t?tid2;??
  48. int?connfd?=?*((int?*)vargp);??
  49. ??
  50. int?idata;??
  51. char?temp[100];??
  52. while(1){??
  53. //printf("me:?\n?");??
  54. fgets(temp,100,stdin);??
  55. send(connfd,temp,100,0);??
  56. printf("??????????client?send?OK\n");??
  57. ??
  58. }??
  59. ??
  60. ??
  61. printf("client?send\n");??
  62. return?NULL;??
  63. }??
  64. ??
  65. ??
  66. void?*threadrecv(void?*vargp)??
  67. {??
  68. char?temp[100];??
  69. int?connfd?=?*((int?*)vargp);??
  70. while(1){??
  71. int?idata?=?0;??
  72. idata?=?recv(connfd,temp,100,0);??
  73. if(idata?>?0){??
  74. printf("server?:\n%s\n",temp);??
  75. }??
  76. }??
  77. ??
  78. ??
  79. return?NULL;??
  80. }??

服務器端代碼:

threadsend負責服務器端發送信息;

threadrecv負責接受客戶端信息。

[html]?view plain?copy
  1. #include?<stdlib.h>??
  2. #include?<stdio.h>??
  3. #include?<errno.h>??
  4. #include?<string.h>??
  5. #include?<unistd.h>??
  6. #include?<netdb.h>??
  7. #include?<sys/socket.h>??
  8. #include?<netinet/in.h>??
  9. #include?<sys/types.h>??
  10. #include?<arpa/inet.h>??
  11. #include?<pthread.h>??
  12. #define?PORT?15636??
  13. void?*thread(void?*vargp);??
  14. void?*threadsend(void?*vargp);??
  15. void?*threadrecv(void?*vargp);??
  16. ??
  17. int?main()??
  18. {??
  19. ??
  20. int?listenfd?=?socket(AF_INET,?SOCK_STREAM,0);??
  21. if(listenfd?<?0){??
  22. ????????perror("socket");??
  23. ????????exit(1);??
  24. }??
  25. ??
  26. struct?hostent?*hp;??
  27. struct?sockaddr_in?serveraddr;??
  28. bzero((char?*)&serveraddr,sizeof(serveraddr));??
  29. serveraddr.sin_family?=?AF_INET;??
  30. serveraddr.sin_addr.s_addr?=?htonl(INADDR_ANY);??
  31. serveraddr.sin_port?=?htons(PORT);??
  32. ??
  33. if(bind(listenfd,(struct?sockaddr?*)&serveraddr,sizeof(serveraddr))?<?0){??
  34. ????????perror("connect");??
  35. ????????exit(1);??
  36. }??
  37. ??
  38. if(listen(listenfd,1024)?<?0){??
  39. ????????perror("listen?error");??
  40. ????????exit(1);??
  41. }??
  42. ??
  43. //char?temp[100];??
  44. struct?sockaddr_in?clientaddr;??
  45. int?clientlen,?*connfdp;??
  46. clientlen?=?sizeof(clientaddr);??
  47. while(1){??
  48. connfdp?=?(int?*)malloc(sizeof(int));??
  49. *connfdp?=?accept(listenfd,(struct?sockaddr?*)&clientaddr,?&clientlen);??
  50. pthread_t?tid;??
  51. printf("Accepted!\n");??
  52. pthread_create(&tid,NULL,thread,connfdp);??
  53. }??
  54. EXIT_SUCCESS;??
  55. }??
  56. ??
  57. void?*thread(void?*vargp)??
  58. {??
  59. ??
  60. pthread_t?tid1,tid2;??
  61. int?connfd?=?*((int?*)vargp);??
  62. int?idata;??
  63. char?temp[100];??
  64. pthread_create(&tid1,NULL,threadsend,vargp);??
  65. pthread_create(&tid2,NULL,threadrecv,vargp);??
  66. return?NULL;??
  67. }??
  68. ??
  69. void?*threadsend(void?*?vargp)??
  70. {??
  71. ??
  72. int?connfd?=?*((int?*)vargp);??
  73. ??
  74. int?idata;??
  75. char?temp[100];??
  76. while(1){??
  77. //printf("server?input:??");??
  78. fgets(temp,100,stdin);??
  79. send(connfd,temp,100,0);??
  80. printf("????????server?send?OK\n");??
  81. }??
  82. return?NULL;??
  83. }??
  84. ??
  85. void?*threadrecv(void?*vargp)??
  86. {??
  87. char?temp[100];??
  88. int?connfd?=?*((int?*)vargp);??
  89. while(1){??
  90. int?idata?=?0;??
  91. idata?=?recv(connfd,temp,100,0);??
  92. if(idata?>?0){??
  93. printf("client?:\n%s\n",temp);??
  94. }??
  95. }??
  96. return?NULL;??
  97. }??

問題:

linux下編譯多線程代碼時,shell提示找不到 pthread_create函數,原因是 pthread.h不是linux系統默認加載的庫文件,應該使用類似如下gcc命令進行編譯:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread參數就可以了。


運行結果:

客戶端:

[html]?view plain?copy
  1. [root@localhost?unixIO]#?./echoclient??
  2. connected??
  3. hello!??
  4. ??????????client?send?OK??
  5. goodmorning??
  6. ??????????client?send?OK??
  7. server?:??
  8. goodmorning?too!??
  9. ??
  10. server?:??
  11. how?r?u???
  12. ??
  13. fine??
  14. ??????????client?send?OK??

服務器端:


[html]?view plain?copy
  1. [root@localhost?unixIO]#?./echoserver??
  2. Accepted!??
  3. client?:??
  4. hello!??
  5. ??
  6. client?:??
  7. goodmorning??
  8. ??
  9. goodmorning?too!??
  10. ????????server?send?OK??
  11. how?r?u???
  12. ????????server?send?OK??
  13. client?:??
  14. fine ?

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

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

相關文章

Linux系統編程(七)消息隊列

Linux系統編程&#xff08;七&#xff09;消息隊列一、什么是消息隊列二、消息隊列內部原理三、實現消息隊列的收發1.發送消息隊列2.接收消息隊列四、消息隊列與命名管道的比較一、什么是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都…

基于Linux的SOCKET編程之TCP半雙工Client-Server聊天程序

轉自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所謂半雙工通信&#xff0c;即通信雙方都可以實現接發數據&#xff0c;但是有一個限制&#xff1a;只能一方發一方收&#xff0c;之后交換收發對…

Linux系統編程(八)線程

Linux系統編程&#xff08;八&#xff09;線程一、什么是線程&#xff1f;二、Linux內核線程實現原理線程共享資源線程非共享資源線程優缺點線程控制原語一、什么是線程&#xff1f; LWP&#xff1a;light weight process 輕量級的進程&#xff0c;本質仍是進程(在Linux環境下…

智能算法(GA、DBO等)求解阻塞流水車間調度問題(BFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

Linux socket編程,對套接字進行封裝

轉自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系統編程(九)線程同步

Linux系統編程&#xff08;九&#xff09;線程同步一、什么是線程同步&#xff1f;二、互斥量三、條件變量pthread_cond_wait函數pthread_cond_signal函數生產者和消費者模型一、什么是線程同步&#xff1f; 線程同步&#xff0c;指一個線程發出某一功能調用時&#xff0c;在沒…

linux網絡編程(一)網絡基礎傳輸知識

linux網絡編程&#xff08;一&#xff09;網絡傳輸基礎知識一、什么是協議&#xff1f;二、使用步驟典型協議2.網絡應用程序設計模式C/S模式B/S模式優缺點3.分層模型4.TCP/IP四層模型通信過程5.協議格式數據包封裝以太網幀格式ARP數據報格式IP段格式UDP數據報格式TCP數據報格式…

linux網絡編程:使用多進程實現socket同時收發數據

轉載&#xff1a;http://blog.csdn.net/li_wen01/article/details/52685844 前面已講過使用一個進程實現服務端和客戶端P2P通信的實例&#xff0c;但是它只能同時處理一個客戶端的連接。如果要實現并發處理多個客戶端的連接并且實現P2P通信&#xff0c;可以使用多進程來處理。相…

Linux 進程學習(四)------ sigaction 函數

轉自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函數&#xff1a; signal 函數的使用方法簡單&#xff0c;但并不屬于 POSIX 標準&#xff0c;在各類 UNIX 平臺上的實現不盡相同&#xff0c;因此其用途受 到了一定的限制…

linux網絡編程(二)高并發服務器

linux網絡編程&#xff08;二&#xff09;高并發服務器錯誤處理高并發服務器多進程并發服務器客戶端錯誤處理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…

linux知識(一) 程序、進程與線程

linux知識&#xff08;一&#xff09; 程序、進程與線程程序進程程序如何變成進程&#xff1f;線程線程與進程fork和創建新線程的區別優點程序 程序&#xff1a;程序是已編譯好的二進制文件&#xff0c;存儲在磁盤中&#xff0c;不占用系統資源 程序包括&#xff1a; RO段&am…

linux 信號signal和sigaction理解

轉載&#xff1a;http://blog.csdn.net/beginning1126/article/details/8680757 今天看到unp時發現之前對signal到理解實在淺顯&#xff0c;今天拿來單獨學習討論下。 signal&#xff0c;此函數相對簡單一些&#xff0c;給定一個信號&#xff0c;給出信號處理函數則可&#xff…

linux知識(二)互斥量、信號量和生產者消費者模型

linux知識&#xff08;二&#xff09;互斥量、信號量和生產者消費者模型一、互斥量產生原因二、信號量生產者消費者模型一、互斥量 產生原因 使用多線程常常會碰到數據混亂的問題&#xff0c;那么使用互斥量&#xff0c;相當于“加鎖”的操作&#xff0c;將有助于解決數據混亂…

基于Linux的Socket編程之TCP全雙工Server-Client聊天程序

轉載&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a40613cfe1 一、引言&#xff1a; 由于accept函數、read、write、recv、send等函數都是是阻塞式的&#xff0c;在同一個進程之中&#xff0c;只要有任何一個…

數據結構(一)線性表

數據結構&#xff08;一&#xff09;線性表一、線性表定義二、順序表定義動態數組三、單鏈表定義不帶頭結點帶頭結點頭結點與不帶頭結點的區別頭插法與尾插法雙鏈表循環鏈表循環單鏈表循環雙鏈表靜態鏈表一、線性表定義 線性表是具有相同數據類型的n個數據元素的有限序列 特點…

linux網絡編程(二)TCP通訊狀態

linux網絡編程&#xff08;二&#xff09;TCP通訊狀態TCP狀態轉換為什么需要等待2MSL&#xff1f;端口復用TCP狀態轉換 tcp協議連接開始會經過三次握手&#xff0c;客戶端和服務器開始都會處于CLOSED狀態 第一次握手&#xff1a;客戶端會先發送SYN請求給服務器&#xff0c;客戶…

gethostbyname() 函數說明

轉載&#xff1a;http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881611.html gethostbyname()函數說明——用域名或主機名獲取IP地址 包含頭文件 #include <netdb.h> #include <sys/socket.h> 函數原型 struct hostent *gethostbyna…

linux網絡編程(三)select、poll和epoll

linux網絡編程&#xff08;三&#xff09;select、poll和epoll一、為什么會有多路I/O轉接服務器&#xff1f;二、select三、poll三、epoll一、為什么會有多路I/O轉接服務器&#xff1f; 為什么會有多路I/O轉接服務器呢&#xff1f;在學這個之前&#xff0c;我們同使用的是多線…

Linux socket編程(一) 對套接字操作的封裝

轉載:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 以前寫的&#xff0c;現在回顧一下&#xff1a; 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.…

數據結構(二)棧

棧一、棧順序棧線性棧(不帶頭結點)線性棧(帶頭結點)共享棧一、棧 棧是只允許在一端進行插入或刪除操作的線性表。 棧頂&#xff1a;線性表允許進行插入刪除的那一端 棧底&#xff1a;固定的&#xff0c;不允許進行插入和刪除的那一端 空棧&#xff1a;不含如何元素的空表 順序…