300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 利用多线程实现linux下C语言的聊天室程序:

利用多线程实现linux下C语言的聊天室程序:

时间:2019-08-22 09:43:38

相关推荐

利用多线程实现linux下C语言的聊天室程序:

转载:/content/16/0421/11/478627_552531090.shtml

利用多线程实现linux下C语言的聊天室程序:

客户端代码:

threadsend线程负责客户端消息的发送;

threadrecv线程负责客户端接受服务器端的消息。

[html]view plaincopy#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>#defineMAXLINE100;void*threadsend(void*vargp);void*threadrecv(void*vargp);intmain(){int*clientfdp;clientfdp=(int*)malloc(sizeof(int));*clientfdp=socket(AF_INET,SOCK_STREAM,0);structsockaddr_inserveraddr;structhostent*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,(structsockaddr*)&serveraddr,sizeof(serveraddr))<0){printf("connecterror\n");exit(1);}pthread_ttid1,tid2;printf("connected\n");while(1){pthread_create(&tid1,NULL,threadsend,clientfdp);pthread_create(&tid2,NULL,threadrecv,clientfdp);}returnEXIT_SUCCESS;}void*threadsend(void*vargp){//pthread_ttid2;intconnfd=*((int*)vargp);intidata;chartemp[100];while(1){//printf("me:\n");fgets(temp,100,stdin);send(connfd,temp,100,0);printf("clientsendOK\n");}printf("clientsend\n");returnNULL;}void*threadrecv(void*vargp){chartemp[100];intconnfd=*((int*)vargp);while(1){intidata=0;idata=recv(connfd,temp,100,0);if(idata>0){printf("server:\n%s\n",temp);}}returnNULL;}

服务器端代码:

threadsend负责服务器端发送信息;

threadrecv负责接受客户端信息。

[html]view plaincopy#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>#definePORT15636void*thread(void*vargp);void*threadsend(void*vargp);void*threadrecv(void*vargp);intmain(){intlistenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){perror("socket");exit(1);}structhostent*hp;structsockaddr_inserveraddr;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,(structsockaddr*)&serveraddr,sizeof(serveraddr))<0){perror("connect");exit(1);}if(listen(listenfd,1024)<0){perror("listenerror");exit(1);}//chartemp[100];structsockaddr_inclientaddr;intclientlen,*connfdp;clientlen=sizeof(clientaddr);while(1){connfdp=(int*)malloc(sizeof(int));*connfdp=accept(listenfd,(structsockaddr*)&clientaddr,&clientlen);pthread_ttid;printf("Accepted!\n");pthread_create(&tid,NULL,thread,connfdp);}EXIT_SUCCESS;}void*thread(void*vargp){pthread_ttid1,tid2;intconnfd=*((int*)vargp);intidata;chartemp[100];pthread_create(&tid1,NULL,threadsend,vargp);pthread_create(&tid2,NULL,threadrecv,vargp);returnNULL;}void*threadsend(void*vargp){intconnfd=*((int*)vargp);intidata;chartemp[100];while(1){//printf("serverinput:");fgets(temp,100,stdin);send(connfd,temp,100,0);printf("serversendOK\n");}returnNULL;}void*threadrecv(void*vargp){chartemp[100];intconnfd=*((int*)vargp);while(1){intidata=0;idata=recv(connfd,temp,100,0);if(idata>0){printf("client:\n%s\n",temp);}}returnNULL;}

问题:

linux下编译多线程代码时,shell提示找不到 pthread_create函数,原因是 pthread.h不是linux系统默认加载的库文件,应该使用类似如下gcc命令进行编译:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread参数就可以了。

运行结果:

客户端:

[html]view plaincopy[root@localhostunixIO]#./echoclientconnectedhello!clientsendOKgoodmorningclientsendOKserver:goodmorningtoo!server:howru?fineclientsendOK

服务器端:

[html]view plaincopy[root@localhostunixIO]#./echoserverAccepted!client:hello!client:goodmorninggoodmorningtoo!serversendOKhowru?serversendOKclient:fine

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。