




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include #pragma comment (lib,ws2_32.lib)/客户端发送给服务端的消息类型#define clientsend_exit 1#define clientsend_tran 2#define clientsend_list 3/服务端发送给客户端的消息类型#define serversend_selfid 1#define serversend_newusr 2#define serversend_showmsg 3#define serversend_online 4/定义记录聊天记录的文件指针file *ioutfileserver;f
2、ile *ioutfileclient;/服务端接收消息的结构体,客户端使用这个结构体发送数据struct creceivepackageint itype; /存放消息类型int itoid; /存放目标用户idint ifromid; /存放原用户idchar cbuffer1024; /存放消息内容;/服务端发送消息的结构体,服务端使用这个结构体发送数据struct csendpackageint itype; /消息类型int icurconn; /当前在线用户数量char cbuffer1024; /存放消息内容;/服务端存储在线用户信息的结构体struct cusersocketi
3、nfoint id; /用户的idchar cdstip64; /用户的ip地址,扩展使用int iport; /用户应用程序端口扩展使用socket susersocket; /网络句柄;/客户端存储在线用户列表的结构体struct cuserint id; /用户的idchar cdstip64; /用户的ip地址 扩展时使用;struct cuser usr20; /客户端存储用户信息的对象int bsend=0; /是否可以发送消息int imyself; /自己的idint inew=0; /在线用户数struct cusersocketinfo usrinfo20; /服务端存储用
4、户信息的对象/函数exitsystem用于实现点对点方式的退出void exitsystem()if(ioutfileserver!=null)fclose(ioutfileserver);if(ioutfileclient!=null)fclose(ioutfileclient);wsacleanup();exit(0);/函数threadproclient是客户端接收消息的线程dword winapi threadproclient(lpvoid pparam)socket hsock=(socket)pparam;char crecvbuffer1024;char cshowbuffer
5、1024;int num=0;if(hsock!=invalid_socket)printf(start:n);while(1)num = recv(hsock,crecvbuffer,1024,0);if(num = 0)crecvbuffernum=0;sprintf(cshowbuffer,to me : %sn,crecvbuffer);printf(%s,cshowbuffer);fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileclient);fflush(ioutfileclient);/fflush 清理文
6、件缓存区,文件以写方式打开时将缓冲区内容写入文件,在头文件stdio.h中,文件原型:int fflush(file*stream)if(strcmp(exit,crecvbuffer)=0)exitsystem();return 0; /结束线程/函数threadproserver是服务端接收消息的线程dword winapi threadproserver(lpvoid pparam)socket hsock=(socket)pparam;char crecvbuffer1024;char cshowbuffer1024;int num=0;if(hsock!=invalid_socket
7、)printf(start:n);while(1)num = recv(hsock,crecvbuffer,1024,0); /接受消息 /rece=receiveif(num = 0)crecvbuffernum=0;sprintf(cshowbuffer,to me : %sn,crecvbuffer);printf(%s,cshowbuffer);/记录消息fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileserver); /ioutfileserverfflush(ioutfileserver);if(strcmp
8、(exit,crecvbuffer)=0)exitsystem();return 0; / 结束线程void createserver()socket m_sockserver;struct sockaddr_in serveraddr; /本地地址信息struct sockaddr_in serveraddrfrom; /连接的地址信息int iport=4600; /设定为固定端口int ibindresult=-1; /绑定结果int iwhilecount=200;struct hostent* localhost;char* localip;socket m_server;char
9、cwelcombuffer=welcome to you!0;int len=sizeof(struct sockaddr);int iwhilelistencount=10;dword nthreadid = 0;int ires; /发送的返回值char csendbuffer1024; /发送消息缓存char cshowbuffer1024; /接收消息缓存ioutfileserver= fopen(messageserver.txt,a); /打开记录消息的文件m_sockserver = socket ( af_inet,sock_stream, 0);printf(本机绑定的端口号
10、(大于1024):);scanf(%d,&iport);localhost = gethostbyname();localip = inet_ntoa (*(struct in_addr *)*localhost-h_addr_list);/设置网络地址信息serveraddr.sin_family = af_inet;serveraddr.sin_port = htons(iport); /端口serveraddr.sin_addr.s_un.s_addr = inet_addr(localip);/地址/绑定地址信息ibindresult=bind(m_sockserver,(struct
11、 sockaddr*)&serveraddr,sizeof(struct sockaddr);/如果端口不能被绑定,重新设置端口while(ibindresult!=0 & iwhilecount 0)printf(绑定失败,重新输入:);scanf(%d,iport);/设置网络地址信息serveraddr.sin_family = af_inet;serveraddr.sin_port = htons(iport); /端口serveraddr.sin_addr.s_un.s_addr = inet_addr(localip);/ip/绑定地址信息ibindresult = bind(m_
12、sockserver,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr);iwhilecount-;if(iwhilecount0)printf(start listenn);listen(m_sockserver,0); /返回值判断单个监听是否超时m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);if(m_server!=invalid_socket)/有连接成功,发送欢迎信息send(m_server,cwelcombuffer,sizeof(c
13、welcombuffer),0);/启动接收消息的线程createthread(null,0,threadproserver,(lpvoid)m_server,0,&nthreadid );break;printf(.);iwhilelistencount-;if(iwhilelistencount0) /输入消息不能为空ires = send(m_server,csendbuffer,strlen(csendbuffer),0);/发送消息if(ires0)printf(发送失败);elsesprintf(cshowbuffer,send to : %sn,csendbuffer);prin
14、tf(%s,cshowbuffer);fwrite(cshowbuffer ,sizeof(char),strlen(cshowbuffer),ioutfileserver);/将消息写入日志if(strcmp(exit,csendbuffer)=0)exitsystem();int checkip(char *cip)char ipaddress128; /ip地址字符串char ipnumber4; /ip地址中每组的数值int isubip=0; /ip地址中4段之一int idot=0; /ip地址中.的个数int iresult=0;int iipresult=1;int i; /循
15、环控制变量memset(ipnumber,0,4);strncpy(ipaddress,cip,128);for(i=0;i255)iipresult = 0;memset(ipnumber,0,4);elseipnumberisubip+=ipaddressi;if(idot=3 & iipresult!=0)iresult= 1;return iresult;/函数creatclient负责创建点对点的客户端模块,客户端需要用户数据服务的ip地址,与服务端建立连接后简历接收消息的线程,同时启动发送消息的循环void createclient()socket m_sockclient;str
16、uct sockaddr_in clientaddr;char cserverip128;int iwhileip=10; /循环次数int icnnres; /连接结果dword nthreadid = 0; /线程id值char csendbuffer1024; /发送缓存char cshowbuffer1024; /显示缓存char crecvbuffer1024; /接收缓存int num; /接收的字符个数int ires; /发送消息的结果int iipres; /检测ip是否正确m_sockclient = socket ( af_inet,sock_stream, 0 );pr
17、intf(请输入服务器地址:);scanf(%s,cserverip);/ip地址判断if(strlen(cserverip)=0)strcpy(cserverip,127.0.0.1); /没有输入地址,使用回环地址elseiipres=checkip(cserverip);while(!iipres & iwhileip0)printf(请重新输入服务器地址:n);scanf(%s,cserverip); /重新输入ip地址iipres=checkip(cserverip); /检测ip的合法性iwhileip-; /如果输入次数过多,即多于本函数段开头iwhileip定义的次数,则此线程
18、结束if(iwhileip 0 )printf(receive from server : %sn,crecvbuffer); /输出接收到的缓存信息crecevbuffer/启动接收消息的线程createthread(null,0,threadproclient,(lpvoid)m_sockclient,0,&nthreadid );while(1)memset(csendbuffer,0,1024);scanf(%s,csendbuffer);if(strlen(csendbuffer)0) /输入信息不能为空ires=send(m_sockclient,csendbuffer,strle
19、n(csendbuffer),0);if(ires=0) /发送消息不能为空p = (struct creceivepackage*)crecvbuffer;switch(p-itype)case clientsend_tran: /对消息进行中转 clientsend_tranlatesfor(m=0;mitoid)/组包stmp=usrinfom.susersocket;memset(&sp,0,sizeof(sp);sp.itype=serversend_showmsg;strcpy(sp.cbuffer,p-cbuffer);ires = send(stmp,(char*)&sp,si
20、zeof(sp),0); /发送内容if(ires0)printf(发送失败n);break;case clientsend_list: /发送在线用户memset(&sp,0,sizeof(sp);for(j=0;jifromid & usrinfoj.id!=0)sp.cbufferj=usrinfoj.id;sp.itype=serversend_online;send(hsock,(char*)&sp,sizeof(sp),0);break;case clientsend_exit:printf(退出系统n);return 0; /结束线程break;return 0;/函数notyi
21、fyuproc式服务器通知所有客户端有新用户登录的线程dword winapi notyifyproc(lpvoid pparam) /ipvoidstruct csendpackage sp; /发送包socket stemp; /连接用户的socket句柄int *p; /接收主线程发送过来的id值int j; /循环控制变量p=(int*)pparam; /新用户idfor(j=0;jh_addr_list);/获取本地ipserveraddr.sin_family = af_inet;serveraddr.sin_port = htons(4600); /设置绑定的端口号servera
22、ddr.sin_addr.s_un.s_addr = inet_addr(localip); /设置本地ip/创建套接字m_sockserver = socket ( af_inet,sock_stream, 0);if(m_sockserver = invalid_socket) /inualid_socketprintf(建立套接字失败n);exit(0);/绑定本地ip地址ires=bind(m_sockserver,(struct sockaddr*)&serveraddr,sizeof(struct sockaddr);if(ires 0)printf(建立套接字失败n);exit(
23、0);/程序主循环while(1)listen(m_sockserver,0); /开始监听m_server=accept(m_sockserver,(struct sockaddr*)&serveraddrfrom,&len);/接收连接if(m_server!=invalid_socket)printf(有新用户登陆); /对方已登陆if(iconnect 0)createthread(null,0,notyifyproc,(lpvoid)&id,0,&nthreadid );iconnect+;elsesend(m_server,cwarnbuffer,sizeof(cwarnbuffe
24、r),0); /已超出最大连接数wsacleanup();dword winapi threadtranclient(lpvoid pparam)socket hsock=(socket)pparam;int i; /循环控制变量char crecvbuffer2048; /接收消息的缓存intnum; /接收消息的字符数/char ctmp2; /临时存放在线用户idstruct creceivepackage sp; /服务端的接收包是,客户端的发送包struct csendpackage *p; /服务端的发送包是,客户端的接收包int itemp; /临时存放接收到的id值while(
25、1)num = recv(hsock,crecvbuffer,2048,0);/接收消息if(num=0)p = (struct csendpackage*)crecvbuffer;if(p-itype=serversend_selfid)imyself=atoi(p-cbuffer);sp.itype=clientsend_list; /请求在线人员列表send(hsock,(char*)&sp,sizeof(sp),0);if(p-itype=serversend_newusr) /登陆用户iditemp = atoi(p-cbuffer);usrinew+.id=itemp; /inew
26、表示有多少个新用户登陆printf(有新用户登录,可以与其聊天n);bsend=1; /可以发送消息聊天if(p-itype=serversend_showmsg) /显示接受的消息printf(rec:%sn,p-cbuffer);if(p-itype=serversend_online) /获取在线列表for(i=0;icbufferi!=imyself & p-cbufferi!=0)usrinew+.id=p-cbufferi;printf(有用户在线,可以与其聊天n);bsend=1;/可以发送消息聊天if(!bsend)printf(在线列表为空n);return 0;void e
27、xittransystem()wsacleanup();exit(0);void createtranclient()socket m_sockclient; /建立连接的socketstruct sockaddr_in clientaddr; /目标的地址信息int ires;/函数执行情况char csendbuffer1024; /发送消息的缓存dword nthreadid = 0; /保存线程的id值struct creceivepackage sp; /发包结构char ipbuffer128;printf(输入服务器ip地址n);scanf(%s,ipbuffer);clientaddr.sin_family = af_inet;clientaddr.sin_port = htons(4600); /连接的端口号clientaddr.sin_addr.s_un.s_addr = inet_addr(ipbuffer);m_sockclient = socket
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省枣庄市山亭区2023-2024学年度第二学期期末六年级科学试题(含答案)
- 2025年中国儿童游乐设备行业发展监测及投资战略研究报告
- 2025年电动自行车项目成效分析报告
- 2025浙江宁波慈溪市煤气有限公司招聘录用人员笔试历年参考题库附带答案详解
- 2025-2031年中国开启式干洗机行业发展前景预测及投资方向研究报告
- 2020-2025年中国农村土地种植行业市场前景预测及投资战略研究报告
- 中国防脱发市场竞争态势及行业投资前景预测报告
- 中国旅居车辆行业发展监测及投资战略规划建议报告
- 2025年中国墨盒行业发展趋势预测及投资战略咨询报告
- 中国电声器件零部件市场全面调研及行业投资潜力预测报告
- 超市消防安全管理制度制度
- 酒店服务流程与空间布局优化
- (2025)医疗护理员理论考试试题含答案
- 2025年广西中考语文试题卷(含答案)
- 建设工程法律培训
- 江苏省南通市2024-2025学年高二下学期6月期末质量监测政治试题(含答案)
- 2025年南京市中考数学真题试卷
- 2025年呼伦贝尔农垦集团有限公司招聘笔试参考题库含答案解析
- 2025年重庆市中考数学试卷真题(含标准答案)
- 2024广西专业技术人员继续教育公需科目参考答案(97分)
- 湘少版小学全部英语单词
评论
0/150
提交评论