c++如何实现简易UDP网络聊天室

  介绍

小编给大家分享一下c++如何实现简易UDP网络聊天室,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

工程名:NetSrv

NetSrv。cpp

//服务器端   # include   # include      void  main ()   {//加载套接字库      ,WORD  wVersionRequested;   ,WSADATA  wsaData;   ,int 犯错;=,,wVersionRequested  MAKEWORD (1,1);   ,=,,err  WSAStartup (wVersionRequested,和wsaData);   ,如果(呃!=0){   ,,返回;   ,}      ,如果(LOBYTE (wsaData.wVersion) !=1, | |, HIBYTE (wsaData.wVersion) !=1) {   WSACleanup才能();   ,,返回;   ,}         ,//创建套接字   ,SOCKET  sockSrv =,插座(AF_INET SOCK_DGRAM 0);//第二个参数是数据报套接字      ,SOCKADDR_IN  addrSrv;//对于服务器端,也就是接收端,先进行一个绑定,定义一个地址结构体的变量   ,addrSrv.sin_addr.S_un.S_addr=htonl (INADDR_ANY);//对结构体中的成员进行赋值,用htonl转换一下   ,//将主机数转换成无符号长整型的网络字节顺序。本函数将一个32位的数从主机字节顺序转换成网络字节顺序。   ,addrSrv.sin_family=AF_INET;//地址族   ,addrSrv.sin_port=htons(6000);//端口号      ,//绑定套接字   ,绑定(sockSrv (SOCKADDR *), addrSrv, sizeof (SOCKADDR));//将本地主机地址和端口进行绑定   ,//套接字,地址结构的指针,地址结构的长度      ,char  recvBuf[100];//字符数组,接收信息   ,char  sendBuf[100];//发送信息   ,char  tempBuf[200];//存放中间数据      ,SOCKADDR_IN  addrClient;//在接收的时候,获取对方的信息,地址结构体的变量   ,int  len=sizeof (SOCKADDR);//初始化,长度为,地址结构体的长度      ,而(1)//保证通讯过程能够持续进行   ,{//等才能待并接收数据   recvfrom才能(sockSrv recvBuf 100 0 (SOCKADDR *), addrClient,, len);//才能套接字,接收数据缓冲区,其长度,,地址结构的指针,指向整型的指针主要用来返回所接收的地址长度   如果才能(& # 39;提问# 39;==recvBuf[0])//判断接收的数据第一个字符是问吗,   {才能   ,,sendto (sockSrv“q", strlen (“q") + 1, 0, (SOCKADDR *), addrClient, len);   ,,//若是,服务器也发一个问字符,套接字,q,长度多发一个字,节,地址用刚刚得到的,最后一个是地址结构的长度,通过len可得   ,,printf (“Chat 结束! \ n");   ,才能打破;   ,,}//才能如果接收的不是q,那么对数据进行一个格式化,放到tempBuf中,点分十进制的ip地址,所接收的数据。   sprintf才能(tempBuf“% s  say :, % s", inet_ntoa (addrClient.sin_addr) recvBuf);      ,,printf (“% s \ n" tempBuf);//将数据打印输出//发才能送数据   ,,printf (“please  input 数据:\ n");   ,,   有才能(sendBuf);//从标准输入流中获取一行数据,当我们输入一行数据,以回车,就把数据放到指定的内存指针中了。   ,,   sendto才能(sockSrv、sendBuf strlen (sendBuf) + 1, 0, (SOCKADDR *), addrClient, len);//才能套接字,所要发送的数据,(这个是数据长度,用strlen获取)多发一个字节,所发送的地址,   ,,   ,}   ,   ,//关闭套接字   ,closesocket (sockSrv);   ,WSACleanup();//终止对套接字的使用   }

NetClient。cpp

//客户端   # include   # include      void  main () {   ,//加载套接字库   ,WORD  wVersionRequested;   ,WSADATA  wsaData;   ,int 犯错;=,,wVersionRequested  MAKEWORD (1,1);=,,err  WSAStartup (wVersionRequested,和wsaData);   ,如果(呃!=0){   返回才能;   ,}   ,如果(LOBYTE (wsaData.wVersion) !=1 | |, HIBYTE (wsaData.wVersion) !=1) {   WSACleanup才能(,);   返回才能;   ,}   ,//创建套接字   ,SOCKET  sockClient =,插座(AF_INET SOCK_DGRAM 0);   ,//类型(数据报),自动选择合适协议      ,SOCKADDR_IN  addrSrv;   ,//基于乌利希期刊指南的客户端(发送端),不需要去绑定,但是需要设置发送到对方机器的地址信息   ,//服务器端的地址信息,因为在本机上,所以还是127.0.0.1),用inet_addr将点分十进制转换成ulang类型=,,addrSrv.sin_addr.S_un.S_addr  inet_addr (“127.0.0.1");=,,addrSrv.sin_family  AF_INET;=,,addrSrv.sin_port  htons(6000);//设置服务器端程序在哪个端口上等待数据   ,   ,char  recvBuf[100];//接收数据   ,char  sendBuf[100];//发送数据   ,char  tempBuf[200];//临时数据的存储   ,   ,int  len =, sizeof (SOCKADDR);//接收所返回的地址结构的长度      ,而(1)   ,{//发才能送数据   ,,printf (“Please  input 数据:\ n");   有才能(sendBuf);   sendto才能(sockClient、sendBuf strlen (sendBuf) + 1, 0, (SOCKADDR *), addrSrv, len);//等才能待并接收数据   recvfrom才能(sockClient recvBuf 100 0 (SOCKADDR *), addrSrv,, len);   如果才能(& # 39;提问# 39;==recvBuf [0])   {才能   ,,sendto (sockClient“q", strlen (“q") + 1, 0, (SOCKADDR *), addrSrv, len);   ,,printf (“Chat 结束! \ n");   ,才能打破;   ,,}   sprintf才能(tempBuf“% s  say :, % s", inet_ntoa (addrSrv.sin_addr) recvBuf);//才能服务器端ip地址信息(格式化),接收的数据   ,,printf (“% s \ n" tempBuf);   ,,   ,}   ,//关闭套接字   ,closesocket (sockClient);   ,WSACleanup ();   }

c++如何实现简易UDP网络聊天室