winsocket编程_UDPchat(C++)

server端代码:

#include <WinSock2.h>
#include <iostream>
using namespace std;
void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested=MAKEWORD(2,2);

	err=WSAStartup(wVersionRequested,&wsaData);

	if(err!=0){
		return;
	}
	if(LOBYTE(wsaData.wVersion)!=2||
		HIBYTE(wsaData.wVersion)!=2){
			WSACleanup();
			return;
	}

	//创建套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
	//绑定
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);

	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	//定义字符数组
	char recvBuf[100];
	char sendBuf[100];

	//因为我们接收数据的时候,我们需要获取和我们通信的这一方的地址信息,通过调用recvfrom函数得到的,但是我们需要提供一个结构体的变量。
	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	//收发数据
	while(1)
	{
		//这是服务端,首先需要接收数据
		recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
		/*当我们接收到数据的时候要进行一个判断,判断数据的第一个字符是不是q,
		如果是q,表明和我们通讯的这一方他想要退出。既然他想要退出,我们也给她发一个q,让它结束。*/
		if(recvBuf[0]=='q'){
			sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
			cout<<"chat end !"<<endl;
			break;
		}
		cout<<inet_ntoa(addrClient.sin_addr)<<"say: "<<recvBuf<<endl;
		cout<<"please input the data :"<<endl;
		cin>>sendBuf;
		//发送数据
		sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
	}
	closesocket(sockSrv);
	WSACleanup();

}
//第一次没编译过去的原因是因为sendto函数中的参数写错了

client端代码:

#include<WinSock2.h>
#include<iostream>
using namespace std;
void main()
{
	//加载套接字
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested=MAKEWORD(2,2);

	err=WSAStartup(wVersionRequested,&wsaData);
	if(err!=0){
		return;
	}
	if(LOBYTE(wsaData.wVersion)!=2||
		HIBYTE(wsaData.wVersion)!=2){
			WSACleanup();
			return;
	}

	//创建套接字
	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

	SOCKADDR_IN addrSrv;
	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];
	
	int len=sizeof(SOCKADDR);
	while(1){
		//作为客户端/发送端首先要发送数据
		cout<<"please input the data: "<<endl;
		cin>>sendBuf;
		sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
		//接收数据
		recvfrom(sockClient,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR*)&addrSrv,&len);
		if(recvBuf[0]=='q'){
			sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);
			cout<<"chat end!"<<endl;
			break;
		}
		cout<<inet_ntoa(addrSrv.sin_addr)<<"say: "<<recvBuf<<endl;
	}
	closesocket(sockClient);
	WSACleanup();
}

运行结果:
在这里插入图片描述注意 因为输入用的是cin,所以遇到空格就停了,可以使用get()等函数输入遇到回车才结束输入。

猜你喜欢

转载自blog.csdn.net/qq_43633973/article/details/89341240