多线程实现服务器和客户端聊天_第1页
多线程实现服务器和客户端聊天_第2页
多线程实现服务器和客户端聊天_第3页
多线程实现服务器和客户端聊天_第4页
多线程实现服务器和客户端聊天_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include #include #pragma comment(lib,ws2_32.lib)/*定义客户端连接上后的聊天线程函数*/DWORD WINAPI ClientThread(LPVOID lpParam)SOCKET sock = (SOCKET)lpParam;/定义连接客户端的套接字char szBuff2048;/定义接收缓冲区char szMessage2048;/定义发送的消息int ret,nLeft,idx;/nLeft,idx用以控制写缓冲的数据,以保证数据写入正确/提示输入exit退出聊天puts(输入exit可退出聊天n);/进入数据传输循环,即聊天/缺陷是

2、只能一人一句来回对话while(1)/ 接收 /ret = recv(sock,szBuff,2048,0);if(ret = 0) break;else if(ret = SOCKET_ERROR)printf(recv() failed:%dn,WSAGetLastError();break;szBuffret = 0;/判断对方发过来的是否为exit退出命令,若是则退出聊天继续监听if(!strcmp(szBuff,exit) printf(对方已经停止聊天!n);printf(服务器正在监听);break;printf(客户:%sn,szBuff);/在控制台打印客户的聊天语句/ 回复

3、 /printf(发送消息:); /服务器输入数据回答客户gets(szMessage);/若发送为空,则传送不说话三字,并提示if(strlen(szMessage)=0)printf(发送不能为空哦n);strcpy(szMessage,不说话!);/传送数据nLeft = strlen(szMessage);idx = 0;/确保写进所有数据while(nLeft0)ret = send(sock,&szMessageidx,nLeft,0);if(ret = 0)break;else if(ret = SOCKET_ERROR)printf(send error!%dn,WSAGetL

4、astError();break;nLeft-=ret;idx +=ret;/判断szMessage是否为exit命令,若是则退出聊天继续监听if(!strcmp(szMessage,exit) printf(连接正在断开!n);printf(服务器继续监听n);break;return 0;/主函数int main(int argc, char* argv)WSADATA wsd;/定义WINSOCK32消息结构体SOCKET sServSock;/服务器端的套接字SOCKET sConns;/服务器的各连接HANDLE hThread;/定义处理客户连接的县城DWORD dwThreadI

5、d;/定义线程IDchar szAddress128;/监听的地址struct hostent *host = NULL;/定义本地地址指针sockaddr_in local,client;/分别定义本地,客户端的地址结构int nSockErr;/定义出错信息printf(请你输入监听地址(格式如202.204.118.138):);gets(szAddress);int nAddrLen = sizeof(client);/得到地址结构长度/初始化Winsock32库if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)printf(failed to load w

6、insock!n);return 1;/建立socket对象sServSock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);/流套接字,面向连接/为socket分配端口地址监听local.sin_family = AF_INET;local.sin_port = htons(5150);/监听端口/若地址出错则监听本机地址if(local.sin_addr.s_addr = inet_addr(szAddress)=INADDR_NONE)puts(所输入的地址不正确,本服务将使用本机地址!);/得到主机名if(gethostname(szAddress,

7、sizeof(szAddress)=SOCKET_ERROR)/得到本机的域名,名称 puts(Cant getting local host name.);/通过主机名得到主机IP地址host = gethostbyname(szAddress);/得到本地ipif(host)CopyMemory(&local.sin_addr,host-h_addr_list0,host-h_length);elseprintf(gethostbyname() failed:%dn,WSAGetLastError();Sleep(5000);return 1;/将套接字绑定到本机地址local上if(bi

8、nd(sServSock,(LPSOCKADDR)&local,sizeof(local)=SOCKET_ERROR)nSockErr = WSAGetLastError();printf(bind error:%d!n, nSockErr);return 1;/监听客户连接请求if(listen(sServSock,5)=SOCKET_ERROR)nSockErr =WSAGetLastError();printf(listen error:%dn, nSockErr);return 1;/提示状态printf(服务器启动成功!n);printf(服务器正在监听n);/进入处理连接循环whi

9、le(1)/若有客户连接,则接受连接sConns = accept(sServSock,(struct sockaddr *)&client,&nAddrLen);if(sConns = INVALID_SOCKET)nSockErr = WSAGetLastError();printf(accept error %dn,nSockErr);break;/连接正确则提示可以开始聊天printf(%s:%d连接到了本服务,现在可以聊天了.n,inet_ntoa(client.sin_addr),ntohs(client.sin_port);/创建一个线程用于聊天hThread = CreateT

10、hread(NULL,0,ClientThread, (LPVOID)sConns,0,&dwThreadId);if(hThread = NULL)printf(CreateThread() failed %dn,GetLastError();break;/聊天结束关闭聊天线程,继续监听CloseHandle(hThread);closesocket(sServSock);WSACleanup();return 0;/*客户端*/#includestdafx.h#include#include#pragmacomment(lib,ws2_32.lib)intmain(intargc,char

11、*argv)WSADATAwsd;/定义winsock32信息结构SOCKETsClient;/定义本地套接字charszBuffer2048;/定义接受的缓冲charszMessage2048;/发送的消息charszServer128;/连接的服务器地址,IP地址intret;structsockaddr_inserver;/定义连接的服务器地址structhostent*host=NULL;/定义地址/提示输入连接的服务器地址printf(请输入连接的服务器IP地址(如:202.204.118.138):);gets(szServer);/初始winsock库if(WSAStartup(

12、MAKEWORD(2,2),&wsd)!=0)printf(FailedtoloadWinsocklibrary!n);Sleep(5000);return1;/strcpy(szMessage,我是*);/建立socket对象sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sClient=INVALID_SOCKET)printf(socket()failed:%dn,WSAGetLastError();Sleep(5000);return1;/定义服务器地址以发送信息server.sin_family=AF_INET;server.si

13、n_port=htons(5150);/端口server.sin_addr.s_addr=inet_addr(szServer);/若没有地址,则将地址设置为本机地址if(server.sin_addr.s_addr=INADDR_NONE)puts(所输入服务器地址不正确,本将使用本机地址!);/得到主机名if(gethostname(szServer,sizeof(szServer)=SOCKET_ERROR)/得到本机的域名,名称puts(Cantgettinglocalhostname.);/通过主机名得到IPhost=gethostbyname(szServer);if(host=N

14、ULL)printf(Unabletoresolveserver:%sn,szServer);Sleep(5000);return1;CopyMemory(&server.sin_addr,host-h_addr_list0,host-h_length);/建立连接if(connect(sClient,(structsockaddr*)&server,sizeof(server)=SOCKET_ERROR)printf(connect()failed:%dn,WSAGetLastError();Sleep(5000);return1;/提示当前状态puts(连接成功,现在可以聊天了!n);pu

15、ts(输入exit可退出聊天n);/进入聊天状态while(1)/发送printf(发送消息:);/写入发送信息gets(szMessage);if(strlen(szMessage)=0)printf(发送不能为空哦n);strcpy(szMessage,不说话!);/发送信息ret=send(sClient,szMessage,strlen(szMessage),0);if(ret=0)elseif(ret=SOCKET_ERROR)printf(send()failed:%dn,WSAGetLastError();Sleep(5000);/判断输入信息是否为exit命令,若是则退出if(!strcmp(szMessage,exit)printf(你已经退出了聊天!);break;/printf(send%dbyten,ret);/接收回复的信息ret=recv(sClient,szBuffer,2048,0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论