【C语言】linux下简单的聊天室程序(TCP+多线程)

来源:互联网 发布:c语言int转double 编辑:程序博客网 时间:2024/06/10 01:38

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

客户端代码:

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

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

#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负责接受客户端信息。

#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 15636void *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参数就可以了。


运行结果:

客户端:

[root@localhost unixIO]# ./echoclientconnectedhello!          client send OKgoodmorning          client send OKserver :goodmorning too!server :how r u?fine          client send OK

服务器端:


[root@localhost unixIO]# ./echoserverAccepted!client :hello!client :goodmorninggoodmorning too!        server send OKhow r u?        server send OKclient :fine