Linux_C使用TCP实现群聊功能
【Linux_C使用TCP实现群聊功能】大二下学期的Linux高级编程作业,比较简单,本文章仅提供代码,仅供参考,挂科模式启动~
题目要求:
- 要求实现一个聊天室程序,至少三个客户端可以同时进入聊天室;
- 服务器程序有日志记录功能,日志中记录每个客户端接入的时间和IP地址
//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参数)
- 在终端运行服务器程序
- 新建终端(多个终端)运行客户端程序
- 在客户端/服务器输入数据,消息可显示
- 客户端输入bye之后断开与服务器的连接
- 关闭服务器程序之后可查看日志文件
推荐阅读
- CVE-2020-16898|CVE-2020-16898 TCP/IP远程代码执行漏洞
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- Beego打包部署到Linux