服务器与客户端简单通信 ——server

阅读:971 2019-03-20 16:45:50 来源:新网

#include#include#include#include#include#include#include#defineserv_port9000#definebuff_size1024structuser{intsocketfd;charname[20];chartoname[20];intresult;//0代表失败1代表成功2代表别人给你发的信息3代表没注册4错误的指令charmsg[100];intcmd;//5代表注册用户10//代表发送信息};structusermanage{intflag[20];//表明哪个空缺structuserusers[20];};pthread_mutex_tmutex;structusermanageumge;voidsave_user(intsocket_fd,structuser*userinfo){pthread_mutex_lock(&mutex);inti=0;for(i=0;i<20;i++){if(umge.flag[i]==1){continue;}umge.users[i].socketfd=socket_fd;strcpy(umge.users[i].name,userinfo->name);userinfo->result=1;umge.flag[i]=1;printf("%sregistersuccess!n",umge.users[i].name);break;}pthread_mutex_unlock(&mutex);}intserver_request(intcfd){intreadsize,writesize;intret=0;inti;structuseruserinfo;inttoname_fd=-1;intisregister=-1;while(readsize=read(cfd,&userinfo,sizeof(userinfo))){if(readsize==-1){perror("read");return-1;}if(userinfo.cmd==5)//注册用户{save_user(cfd,&userinfo);//将用户信息进行保存}elseif(userinfo.cmd==10)//发送信息{//检测该用户是否注册for(i=0;i<20;i++){if(umge.flag[i]==1){if(umge.users[i].socketfd==cfd){if(strcmp(umge.users[i].name,userinfo.name)==0){isregister=1;}}}}if(isregister==1){//寻找要发送的用户for(i=0;i<20;i++){if(umge.flag[i]==1){//找到了要发送的用户,将其socket保存起来if(strcmp(umge.users[i].name,userinfo.toname)==0){toname_fd=umge.users[i].socketfd;}}}if(toname_fd!=-1)//没找到要发送的用户{userinfo.result=2;//找到用户将其返回状态标为1writesize=write(toname_fd,&userinfo,sizeof(userinfo));if(writesize==-1){perror("write");return-1;}printf("%ssendmsgto%s:%sn",userinfo.name,userinfo.toname,userinfo.msg);userinfo.result=1;//发送成功}}else{userinfo.result=3;//没有注册}}else{userinfo.result=4;//错误的指令}writesize=write(cfd,&userinfo,sizeof(userinfo));if(writesize==-1){perror("write");return-1;}memset(userinfo.msg,0,sizeof(userinfo.msg));}}intmain(){intlisten_sockfd;intret;structsockaddr_inserver_addr;//服务器地址结构structsockaddr_inclient_addr;//客户端的地址pthread_mutex_init(&mutex,null);//创建监听套接字listen_sockfd=socket(af_inet,sock_stream,0);if(listen_sockfd==-1){perror("createsocketerror");return-1;}//初始化服务器地址结构bzero(&server_addr,sizeof(server_addr));//将地址结构变量清零server_addr.sin_family=af_inet;//选择ipv4地址server_addr.sin_addr.s_addr=htonl(inaddr_any);//监听本地任意ip地址server_addr.sin_port=htons(serv_port);//将本地端口号转化为网络端口号//绑定本地地址和端口号ret=bind(listen_sockfd,(structsockaddr*)&server_addr,sizeof(server_addr));if(ret==-1){perror("binderror");return-1;}//监听套接字ret=listen(listen_sockfd,20);if(ret==-1){perror("listenerror");return-1;}while(1){intclientfd;socklen_tclient_len=sizeof(client_addr);clientfd=accept(listen_sockfd,(structsockaddr*)&client_addr,&client_len);if(clientfd==-1){perror("accepterror");return-1;}pthread_ttid;//创建线程处理客户端请求intret=pthread_create(&tid,null,server_request,(void*)clientfd);if(ret!=0){printf("createpthreaderror!n");return-1;}pthread_detach(tid);//线程分离}pthread_mutex_destroy(&mutex);return0;}

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服