介绍
小编给大家分享一下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网络聊天室