首页 C语言聊天室代码服务端

C语言聊天室代码服务端

举报
开通vip

C语言聊天室代码服务端C语言聊天室代码服务端 C语言聊天室代码(服务端) /* server.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include<Winsock2.h> #include<process.h> #pragma comment(lib,"ws2_32.lib") #include<windows.h> #define REG 1 //表示注...

C语言聊天室代码服务端
C语言聊天室代码服务端 C语言聊天室代码(服务端) /* server.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include<Winsock2.h> #include<process.h> #pragma comment(lib,"ws2_32.lib") #include<windows.h> #define REG 1 //表示注册 #define LOGIN 2 //表示登陆 #define TALK_PRIVATE 3 //表示私聊 #define TALK_PUBLIC 4 //表示群聊 #define LIST 11 //表示显示所有在线不隐身用户 #define EXIT 12 //退出客户端 struct user { char username[50]; char password[50]; int cmd; char target_user[20]; char content[50]; }; struct user user; char *file_name(char *p,struct user user) 名.txt文件函数 { int i = 0; int username_len; username_len = strlen(user.username); strcpy(p,user.username); strcat(p,".txt"); return p; //生成登陆 } void resign(SOCKET sockfd,struct user user) //注册函数 { int username_len; char buf[50]; char buf_fp[50]; FILE *fp; if((fp=fopen("resign.txt","a+"))==NULL) { perror("open resign.txt failed !\n"); exit(1); } username_len = strlen(user.username); while(1) { if ((fgets(buf_fp,sizeof(buf_fp),fp)) == NULL) { send(sockfd,"right",5,0); strcpy(buf,user.username); buf[strlen(buf)]='\0'; int i = fprintf(fp,"%s",buf); memset(buf,0,sizeof(buf)); strcpy(buf,user.password); printf("%s",buf); i=fprintf(fp,":%s\n",buf); memset(buf,0,sizeof(buf)); fclose(fp); break; } if (strncmp(user.username,buf_fp,strlen(user.username)) == 0) { send(sockfd,"wrong",5,0); break; } } } void //登陆函数 { char buf_fp[100]; char buf[100]; int username_len = strlen(user.username); strcpy(buf,user.username); buf[username_len] = ':'; buf[username_len+1] = '\0'; char *p=strcat(buf,user.password); p[strlen(p)]='\0'; FILE *fp; if((fp=fopen("resign.txt","r+"))==NULL) { perror("open resign.txt failed !\n"); exit(1); } //printf("%s",p); while(1) login(SOCKET sockfd,struct user user) { if ((fgets(buf_fp,sizeof(buf_fp),fp)) == NULL) { send(sockfd,"wrong",5,0); fclose(fp); break; } if (strncmp(p,buf_fp,strlen(buf)) == 0) { send(sockfd,"ok",2,0); fclose(fp); break; } } } struct Client_userName { SOCKET client; char username[50]; }; int main() { printf("\n\t -----------------------------------------------服 -----------------------------------------------\n\n\n"); WSAData wsaData; int err=WSAStartup(WINSOCK_VERSION,&wsaData); if(err!=0) { return -1; } SOCKET ListenSocket=socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET==ListenSocket) { printf("socket() Failed:%d\n",WSAGetLastError()); WSACleanup() 务器 ; return -1; } sockaddr_in service; service.sin_family=AF_INET; service.sin_port=htons(20000); service.sin_addr.s_addr=htonl(INADDR_ANY); err=bind(ListenSocket,(sockaddr*)&service,sizeof(service)); if(SOCKET_ERROR==err) { printf("bind() Failed:%d\n:",WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return -1; } err=listen(ListenSocket,1); if(SOCKET_ERROR==err) { printf("listen() Failed:%d\n",WSAGetLastError()); closesocket(ListenSocket); WSACleanup(); return -1; } #define MAX_CLIENT_NUM 63 struct Client_userName Client[MAX_CLIENT_NUM]; //SOCKET client[MAX_CLIENT_NUM]; for(int i=0;i<MAX_CLIENT_NUM;i++) { Client[i].client=INVALID_SOCKET; memset(Client[i].username,0,sizeof(Client[i].username)); // client[i]=INVALID_SOCKET; } fd_set rset,allset; FD_ZERO(&allset); FD_SET(ListenSocket,&allset); #define MSG_MAX_SIZE 1024*2 //接收的最大值 while(1) { rset=allset; int ret=select(0,&rset,NULL,NULL,NULL); if(ret==SOCKET_ERROR) { printf("select() failed:%Id\n",WSAGetLastError()); break; } if(ret==0) { continue; } if(FD_ISSET(ListenSocket,&rset)) { struct sockaddr_in cliaddr; int clilen=sizeof(cliaddr); SOCKET sockConn=accept(ListenSocket,(sockaddr*)&cliaddr,&clilen); if(INVALID_SOCKET==sockConn) { printf("accept() Failed:%d\n",WSAGetLastError()); break; } for(int i=0;i<MAX_CLIENT_NUM;i++) { if(Client[i].client==INVALID_SOCKET) { Client[i].client=sockConn; break; } } if(i<MAX_CLIENT_NUM) { FD_SET(sockConn,&allset); } else{ printf("too many clients"); closesocket(sockConn); } } for(i=0;i<MAX_CLIENT_NUM;i++) { if(Client[i].client!=INVALID_SOCKET&&FD_ISSET(Client[i].client,&am p;rset)) { memset(&user,0,1); int nByte=recv(Client[i].client,(char*)&user,sizeof(user),0); strcpy(Client[i].username,user.username); printf("Have Message Client[%d]:%s\n",i,Client[i].username); if(user.cmd==REG) { resign(Client[i].client,user); } else if(user.cmd==LOGIN) { login(Client[i].client,user); } else if(user.cmd==TALK_PUBLIC) { struct user Send; strcpy(Send.username,user.username); From strcpy(Send.content,user.content); Send.cmd=TALK_PUBLIC; for(int j=0;j<MAX_CLIENT_NUM;j++) { if(Client[j].client!=INVALID_SOCKET&&j!=i) { send(Client[j].client,(char*)&Send,sizeof(Send),0); } } } else if(user.cmd==TALK_PRIVATE) { for(int j=0;j<MAX_CLIENT_NUM;j++) { if(strcmp(Client[j].username,user.target_user)==0&&j!=i) { struct user Send; strcpy(Send.username,user.username); strcpy(Send.content,user.content); Send.cmd=TALK_PRIVATE; send(Client[j].client,(char*)&Send,size of(Send),0); } } } else if(user.cmd==LIST) { for(int j=0;j<MAX_CLIENT_NUM;j++) { if(Client[j].client!=INVALID_SOCKET&&FD_ISSET(Client[i].client,&am p;rset)&&j!=i) { struct user Send; strcpy(Send.username,Client[j].username); Send.cmd=LIST; send(Client[i].client,(char*)&Send,sizeof(Send),0); } } } else if(user.cmd==EXIT) { struct user Send; Send.cmd=EXIT; send(Client[i].client,(char*)&Send,sizeof(Send),0); FD_CLR(Client[i].client,&allset); closesocket(Client[i].client); Client[i].client=INVALID_SOCKET; memset(Client[i].username,0,sizeof(Client[i].username)); continue; } if(nByte==0) { FD_CLR(Client[i].client,&allset); closesocket(Client[i].client); Client[i].client=INVALID_SOCKET; memset(Client[i].username,0,sizeof(Client[i].username)); continue; } if(nByte==SOCKET_ERROR) { printf("recv() failed:%d\n",WSAGetLastError()); FD_CLR(Client[i].client,&allset); closesocket(Client[i].client); Client[i].client=INVALID_SOCKET; memset(Client[i].username,0,sizeof(Client[i].username)); continue; } } } } closesocket(ListenSocket); WSACleanup(); return -1; }
本文档为【C语言聊天室代码服务端】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_348501
暂无简介~
格式:doc
大小:31KB
软件:Word
页数:12
分类:工学
上传时间:2017-11-26
浏览量:68