轉載:http://www.360doc.com/content/16/0421/11/478627_552531090.shtml
利用多線程實現linux下C語言的聊天室程序:
客戶端代碼:
threadsend線程負責客戶端消息的發送;
threadrecv線程負責客戶端接受服務器端的消息。
[html]?view plain?copy
- #include?<stdlib.h>??
- #include?<stdio.h>??
- #include?<errno.h>??
- #include?<string.h>??
- #include?<unistd.h>??
- #include?<netdb.h>??
- #include?<sys/socket.h>??
- #include?<netinet/in.h>??
- #include?<sys/types.h>??
- #include?<arpa/inet.h>??
- #include?<pthread.h>??
- ??
- #define?MAXLINE?100;??
- void?*threadsend(void?*vargp);??
- void?*threadrecv(void?*vargp);??
- ??
- int?main()??
- {??
- ??
- int?*clientfdp;??
- clientfdp?=?(int?*)malloc(sizeof(int));??
- *clientfdp?=?socket(AF_INET,SOCK_STREAM,0);??
- struct?sockaddr_in?serveraddr;??
- struct?hostent?*hp;??
- bzero((char?*)&serveraddr,sizeof(serveraddr));??
- serveraddr.sin_family?=?AF_INET;??
- serveraddr.sin_port?=?htons(15636);??
- serveraddr.sin_addr.s_addr?=?inet_addr("127.0.0.1");??
- if(connect(*clientfdp,(struct?sockaddr?*)&serveraddr,sizeof(serveraddr))?<?0){??
- ????????printf("connect?error\n");??
- ????????exit(1);??
- }??
- ??
- pthread_t?tid1,tid2;??
- printf("connected\n");??
- while(1){??
- pthread_create(&tid1,NULL,threadsend,clientfdp);??
- ??
- pthread_create(&tid2,NULL,threadrecv,clientfdp);??
- }??
- ??
- return?EXIT_SUCCESS;??
- }??
- ??
- void?*threadsend(void?*?vargp)??
- {??
- //pthread_t?tid2;??
- int?connfd?=?*((int?*)vargp);??
- ??
- int?idata;??
- char?temp[100];??
- while(1){??
- //printf("me:?\n?");??
- fgets(temp,100,stdin);??
- send(connfd,temp,100,0);??
- printf("??????????client?send?OK\n");??
- ??
- }??
- ??
- ??
- printf("client?send\n");??
- return?NULL;??
- }??
- ??
- ??
- void?*threadrecv(void?*vargp)??
- {??
- char?temp[100];??
- int?connfd?=?*((int?*)vargp);??
- while(1){??
- int?idata?=?0;??
- idata?=?recv(connfd,temp,100,0);??
- if(idata?>?0){??
- printf("server?:\n%s\n",temp);??
- }??
- }??
- ??
- ??
- return?NULL;??
- }??
服務器端代碼:
threadsend負責服務器端發送信息;
threadrecv負責接受客戶端信息。
[html]?view plain?copy
- #include?<stdlib.h>??
- #include?<stdio.h>??
- #include?<errno.h>??
- #include?<string.h>??
- #include?<unistd.h>??
- #include?<netdb.h>??
- #include?<sys/socket.h>??
- #include?<netinet/in.h>??
- #include?<sys/types.h>??
- #include?<arpa/inet.h>??
- #include?<pthread.h>??
- #define?PORT?15636??
- void?*thread(void?*vargp);??
- void?*threadsend(void?*vargp);??
- void?*threadrecv(void?*vargp);??
- ??
- int?main()??
- {??
- ??
- int?listenfd?=?socket(AF_INET,?SOCK_STREAM,0);??
- if(listenfd?<?0){??
- ????????perror("socket");??
- ????????exit(1);??
- }??
- ??
- struct?hostent?*hp;??
- struct?sockaddr_in?serveraddr;??
- bzero((char?*)&serveraddr,sizeof(serveraddr));??
- serveraddr.sin_family?=?AF_INET;??
- serveraddr.sin_addr.s_addr?=?htonl(INADDR_ANY);??
- serveraddr.sin_port?=?htons(PORT);??
- ??
- if(bind(listenfd,(struct?sockaddr?*)&serveraddr,sizeof(serveraddr))?<?0){??
- ????????perror("connect");??
- ????????exit(1);??
- }??
- ??
- if(listen(listenfd,1024)?<?0){??
- ????????perror("listen?error");??
- ????????exit(1);??
- }??
- ??
- //char?temp[100];??
- struct?sockaddr_in?clientaddr;??
- int?clientlen,?*connfdp;??
- clientlen?=?sizeof(clientaddr);??
- while(1){??
- connfdp?=?(int?*)malloc(sizeof(int));??
- *connfdp?=?accept(listenfd,(struct?sockaddr?*)&clientaddr,?&clientlen);??
- pthread_t?tid;??
- printf("Accepted!\n");??
- pthread_create(&tid,NULL,thread,connfdp);??
- }??
- EXIT_SUCCESS;??
- }??
- ??
- void?*thread(void?*vargp)??
- {??
- ??
- pthread_t?tid1,tid2;??
- int?connfd?=?*((int?*)vargp);??
- int?idata;??
- char?temp[100];??
- pthread_create(&tid1,NULL,threadsend,vargp);??
- pthread_create(&tid2,NULL,threadrecv,vargp);??
- return?NULL;??
- }??
- ??
- void?*threadsend(void?*?vargp)??
- {??
- ??
- int?connfd?=?*((int?*)vargp);??
- ??
- int?idata;??
- char?temp[100];??
- while(1){??
- //printf("server?input:??");??
- fgets(temp,100,stdin);??
- send(connfd,temp,100,0);??
- printf("????????server?send?OK\n");??
- }??
- return?NULL;??
- }??
- ??
- void?*threadrecv(void?*vargp)??
- {??
- char?temp[100];??
- int?connfd?=?*((int?*)vargp);??
- while(1){??
- int?idata?=?0;??
- idata?=?recv(connfd,temp,100,0);??
- if(idata?>?0){??
- printf("client?:\n%s\n",temp);??
- }??
- }??
- return?NULL;??
- }??
問題:
linux下編譯多線程代碼時,shell提示找不到 pthread_create函數,原因是 pthread.h不是linux系統默認加載的庫文件,應該使用類似如下gcc命令進行編譯:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread參數就可以了。
運行結果:
客戶端:
[html]?view plain?copy
- [root@localhost?unixIO]#?./echoclient??
- connected??
- hello!??
- ??????????client?send?OK??
- goodmorning??
- ??????????client?send?OK??
- server?:??
- goodmorning?too!??
- ??
- server?:??
- how?r?u???
- ??
- fine??
- ??????????client?send?OK??
服務器端:
[html]?view plain?copy
- [root@localhost?unixIO]#?./echoserver??
- Accepted!??
- client?:??
- hello!??
- ??
- client?:??
- goodmorning??
- ??
- goodmorning?too!??
- ????????server?send?OK??
- how?r?u???
- ????????server?send?OK??
- client?:??
- fine ?