当前位置: 首页 > news >正文

永泰县住房和城乡建设局网站小游戏制作平台

永泰县住房和城乡建设局网站,小游戏制作平台,深圳广告公司,中国著名设计建筑多线程在线聊天室 概述客户端服务端 概述 客户端实现了判单用户登录结果、防止单回车字符发送、保存和显示历史聊天记录(仅自己)、退出聊天室功能。   服务端实现了验证用户是否已经存在(支持最大64用户连接)支持广播用户进入退…

多线程在线聊天室

  • 概述
  • 客户端
  • 服务端

概述

  客户端实现了判单用户登录结果、防止单回车字符发送、保存和显示历史聊天记录(仅自己)、退出聊天室功能。
  服务端实现了验证用户是否已经存在(支持最大64用户连接)支持广播用户进入退出聊天室以及用户聊天内容。

客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>typedef struct sockaddr  SA;
typedef struct sockaddr_in  SIN;
#define MAXBACKLOG   100
int Socket(int domain,int type,int protocol);
int Connect(int sockfd,struct sockaddr * serv_addr,int addrlen);
void *son_fun(void * arg);
void save(const char * dbuff,const char * nbuff);
void list_history_msg(const char * nbuff);
int main(int argc,char *argv[])
{	char namebuff[512]={0};pthread_t id;//建立监听套接字int socketfd = Socket(AF_INET,SOCK_STREAM,0);//connectSIN   serverinfo;serverinfo.sin_family = AF_INET;serverinfo.sin_port   = htons(atoi(argv[2]));serverinfo.sin_addr.s_addr =  inet_addr(argv[1]);int addrlen = sizeof(SIN);Connect(socketfd,(SA*)&serverinfo,addrlen);//send nameprintf("请输入昵称:\n");gets(namebuff);write(socketfd,namebuff,sizeof(namebuff));char b[20];read(socketfd,b,sizeof(b));if(strstr(b,"已存在")){printf("已存在\n");close(socketfd);return 0;		}//print serve infoprintf("登入成功,服务器:%s 端口:%d\n",inet_ntoa(serverinfo.sin_addr),ntohs(serverinfo.sin_port));//make son threadpthread_create(&id,NULL,son_fun,(void *)&socketfd);//w while(1){//timetime_t t = time(NULL);struct tm *tinfo = localtime(&t);//msgchar readbuff[512] = {0};gets(readbuff);//prevent "\n" send to serve and save to dataif(strlen(readbuff)==0) continue;//determine wheather it is "ls"if(strcmp(readbuff,"ls") == 0) {list_history_msg(namebuff);continue;}//determine wheather it is "quit"if(strcmp(readbuff,"quit") == 0){char sendbuff[618] = {0};sprintf(sendbuff,"%s : %s%s",namebuff,asctime(tinfo),"退出聊天");write(socketfd,sendbuff,sizeof(sendbuff));close(socketfd);exit(0);}//sendchar sendbuff[618] = {0};sprintf(sendbuff,"%s : %s%s",namebuff,asctime(tinfo),readbuff);write(socketfd,sendbuff,sizeof(sendbuff));//save datasave(sendbuff,namebuff);}//关闭close(socketfd);return 0;
}
void list_history_msg(const char * nbuff)
{char path[128];char *line = NULL;size_t len = 0;sprintf(path,"./userdata/%s.txt",nbuff);FILE * fp = fopen(path,"a+");printf("********聊天记录*********\n");while(getline(&line , &len , fp) != -1)printf("%s",line);printf("************************\n");free(line);fclose(fp);
}
void save(const char * dbuff,const char * nbuff)
{char path[128];sprintf(path,"./userdata/%s.txt",nbuff);FILE * fp = fopen(path,"a+");fprintf(fp,"%s\n",dbuff);fclose(fp);
}int Socket(int domain,int type,int protocol)
{int socketFd = socket(domain,type,protocol);if(socketFd == -1){perror("socket");exit(1);}return socketFd;
}
int Connect (int sockfd,struct sockaddr * serv_addr,int addrlen)
{int val = connect(sockfd,serv_addr,addrlen);if(val == -1){perror("connect");exit(1);}return 0;
}
void *son_fun(void * arg)
{int readpipefd = *((int *)arg);char readbuff[512]={0};while(1){memset(readbuff,0,sizeof(readbuff));if(read(readpipefd,readbuff,sizeof(readbuff))>0){printf("%s\n\n",readbuff);}else{close(readpipefd);pthread_exit(NULL);}}
}

服务端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <semaphore.h>typedef struct sockaddr  SA;
typedef struct sockaddr_in  SIN;
#define MAXBACKLOG   100int Socket(int domain,int type,int protocol);
int Bind(int sockfd,struct sockaddr * my_addr,int addrlen);
int Listen(int s,int backlog);
int Accept(int s,struct sockaddr * addr,int * addrlen);
void *son_fun(void * arg);
int is_exist(char * username);
void broadcast(char *r,char *n);char Userlist[64][20] = {0};
int Userfdlist[64] = {0};int main(int argc,char *argv[])
{	//建立监听套接字int socketfd = Socket(AF_INET,SOCK_STREAM,0);//需要进行重用地址及其端口号int  opt = 1;setsockopt(socketfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//绑定信息编写服务器信息SIN   serverinfo;serverinfo.sin_family = AF_INET;		//协议IPV4serverinfo.sin_port   = htons(atoi(argv[2]));	//网络字节序(大端字节序)与主机字节序(小端字节序)  serverinfo.sin_addr.s_addr =  inet_addr(argv[1]);int addrlen = sizeof(SIN);Bind(socketfd,(SA*)&serverinfo,addrlen);//监听Listen(socketfd,MAXBACKLOG);//读写while(1){//等待连接SIN clientinfo;int  clientaddrlen = sizeof(SA);int newfd = Accept(socketfd,(SA*)&clientinfo,&clientaddrlen);printf("客户端地址:%s 端口号:%d\n",inet_ntoa(clientinfo.sin_addr),ntohs(clientinfo.sin_port));//创建子线程pthread_t id;pthread_create(&id,NULL,son_fun,(void *)&newfd);}//关闭close(socketfd);return 0;
}
int is_exist(char * username)
{for(int i = 0 ; i < 10; i++){if(strcmp(username,Userlist[i]) == 0)return 1;}return 0;
}
void *son_fun(void * arg)
{int readfd = *((int *)arg);char readbuff[512] = {0};char namebuff[ 20] = {0};read(readfd,namebuff,sizeof(namebuff));//determine wherther it is existif(is_exist(namebuff)){write(readfd,"已存在",sizeof("已存在"));close(readfd);pthread_exit(NULL);}else{write(readfd,"登录成功",sizeof("登录成功"));char r[50];sprintf(r,"%s %s",namebuff,"进入聊天室");printf("%s\n",r);broadcast(r,namebuff);}//save username and userfdfor(int i=0;i<10;i++){if(strlen(Userlist[i])==0){strcpy(Userlist[i],namebuff);Userfdlist[i] = readfd;break;}}while(1){memset(readbuff,0,sizeof(readbuff));if(read(readfd,readbuff,sizeof(readbuff))>0){if(strlen(readbuff)>0){//printf("%s\n\n",readbuff);//broadcastbroadcast(readbuff,namebuff);if(strstr(readbuff,"退出聊天"))for(int i=0;i<10;i++)if(strcmp(Userlist[i],namebuff)==0){printf("%s\n",readbuff);strcpy(Userlist[i],"\0");close(readfd);pthread_exit(NULL);}}}else{close(readfd);pthread_exit(NULL);}}
}
void broadcast(char *r,char *n)
{for(int i=0 ; i<10 ;i++)//if it is a user and not himselfif(strcmp(Userlist[i],n)!=0 && strlen(Userlist[i])!=0)write(Userfdlist[i],r,strlen(r));
}
int Socket(int domain,int type,int protocol)
{int socketFd = socket(domain,type,protocol);if(socketFd ==-1){perror("socket");exit(1);}return socketFd;
}
int Bind(int sockfd,struct sockaddr * my_addr,int addrlen)
{int val = bind(sockfd,my_addr,addrlen);if(val){perror("bind");exit(1);}return 0;
}
int Listen(int s,int backlog)
{int val = listen(s,backlog);if(val == -1){perror("listen");exit(1);}return val;
}
int Accept(int s,struct sockaddr * addr,int * addrlen)
{int NEWfd = accept(s,addr,addrlen);if(NEWfd == -1){perror("listen");exit(1);}return NEWfd;
}
http://www.yayakq.cn/news/210069/

相关文章:

  • 让wordpress完美拥有论坛功能seo领导屋
  • 找个免费的网站速成网站 改版 影响
  • 石台做网站滁州市公共资源交易中心
  • 优速网站建设优化seo长治网站制作平台
  • asp.net mvc5 网站开发实践长沙企业建网站费用
  • 网站建设专用名词北京网站建设产品介绍
  • 广州网站建设实力乐云seowordpress种子站
  • 环江建设网站网络运营公司排名
  • 优秀网站菜单网站建设平台策划
  • 别具光芒 Flash互动网站设计大连哪家网站公司好
  • 重庆企业网站优化广州市医院网站建设
  • 四川新站优化网页设计模板加代码
  • 园区做网站的好处平面设计师的培训机构
  • 网站推广被封域名如何做跳转珠海cp网站建设
  • 有做软件的网站有哪些dedecms 旅游网站模板下载
  • 深圳招聘信息在哪个网站合肥专业建设网站
  • 网站建设中页面源码网站建设项目工作分解结构
  • 注册一个个人网站无法定位wordpress内容目录
  • 免费php mysql网站欧米伽男士手表官方网站
  • 柳州网站建设33seo网站三种链接
  • 网联科技网站建设淘宝客做网站还是做app
  • wdcp 默认网站在哪里做企业网站
  • 宜昌建网站什么网站加盟代理做的专业
  • 手机网站 自适应屏幕网站优化的作用
  • 怀化找什么人做网站wordpress category.php制作
  • 建设鲜花网站前的市场分析设计网站模板
  • 西安的网站设计与制作首页国家企业信用信息网查询
  • 网站开发考研是什么专业做零售出口的网站
  • wordpress标题序号东莞seo
  • 重庆汽车网站建设邢台做wap网站