Linux_C使用TCP实现群聊功能

【Linux_C使用TCP实现群聊功能】大二下学期的Linux高级编程作业,比较简单,本文章仅提供代码,仅供参考,挂科模式启动~
题目要求:

  • 要求实现一个聊天室程序,至少三个客户端可以同时进入聊天室;
  • 服务器程序有日志记录功能,日志中记录每个客户端接入的时间和IP地址
TCP服务器端代码:
//serve.c//服务器端代码 #include #include #include #include #include #include #include #include #include #include #define MAXSIZE 128char news[MAXSIZE]; int res; //用以接收函数返回值void* pthread_chat(void * arg)//创建线程用以接收数据 { int confd = *(int *)arg; while(1) { res= recv(confd, news, sizeof(news), 0); if(res <= 0) { perror("recv"); break; } printf("The news is: %s\n",news); memset(news,0,MAXSIZE); send(confd,"OK",2,0); }printf("One client over\n"); close(confd); }char *Time()//获取当前时间 { time_t timer; struct tm *tblock; timer = time(NULL); tblock = localtime(&timer); return asctime(tblock); }void save(char *s)//储存日志文件 { int fd; fd = open("journal",O_RDWR|O_APPEND|O_CREAT); if(fd < 0) perror("open"); else { char *buf = Time(); strcat(buf,s); write(fd,buf,MAXSIZE); write(fd,"\n",2); lseek(fd,0,SEEK_END); if(res < 0) perror("write"); } }int main() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in saddr, caddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(6666); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); res = bind(sockfd,(struct sockaddr*)&saddr, sizeof(saddr)); if(res < 0) perror("bind"); listen(sockfd, 5); //监听端口while(1) { int len = sizeof(caddr); int confd = accept(sockfd,(struct sockaddr*)&caddr, &len); if(confd < 0) { perror("accept"); continue; } else { save(inet_ntoa(caddr.sin_addr)); }printf("Accept confdis:%d, ip=%s\n", confd,inet_ntoa(caddr.sin_addr)); pthread_t tid; pthread_create(&tid, NULL, pthread_chat, &confd); } }

客户端代码如下:
//client.c //客户端代码 #include #include #include #include #include #include #include #define MAXSIZE 128char news[MAXSIZE]; int res; //用来接收函数返回值 int main() { printf("------Welcome join the chat room-----\n"); printf("If you want to quit,please input --bye--\n"); int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_port = htons(6666); saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); int confd = connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr)); if(confd < 0) perror("connect"); while(1) { printf("Please input the news\n"); fgets(news,MAXSIZE,stdin); if(strncmp(news,"bye",3) == 0) { break; }send(sockfd, news, strlen(news), 0); memset(news,0,MAXSIZE); recv(sockfd, news, sizeof(news), 0); printf("The serve's news is: %s\n",news); }close(sockfd); exit(0); }

程序操作方法:(编译程序时需要添加-lpthread参数)
  1. 在终端运行服务器程序
  2. 新建终端(多个终端)运行客户端程序
  3. 在客户端/服务器输入数据,消息可显示
  4. 客户端输入bye之后断开与服务器的连接
  5. 关闭服务器程序之后可查看日志文件

    推荐阅读