Windos下的UPD服务器端的C++实现

UPD服务端的代码,稍微改下参数就可以用了

#include <iostream>
#include <Winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")

using namespace std;

/*

UDP server


*/

int main(void)
{
    
    
	//1.加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1, 1);

	err = WSAStartup(wVersionRequested, &wsaData);

	if (err != 0)
	{
    
    
		return -1;
	}

	if (LOBYTE(wsaData.wVersion) != 1 ||
		HIBYTE(wsaData.wVersion) != 1)
	{
    
    
		WSACleanup();
		return -1;
	}

	//2.创建套接字
	//SOCK_DGRAM 表明要用UDP
	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);

	//3.绑定套接字
	bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

	char recvBuf[100];//用来保存接受的信息
	char sendBuf[100];//用来保存发送的信息
	char tempBuf[200];//用来存放中间临时数据
	char str[INET_ADDRSTRLEN];
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);

	while (1)
	{
    
    
		//4.等待并接收数据
		recvfrom(sockSrv, recvBuf, 100, 0,
			(SOCKADDR*)&addrClient, &len);

		//收到的第一个字符是q表面发送方想退出聊天
		if ('q' == recvBuf[0])  
		{
    
    
			sendto(sockSrv, "q", strlen("q") + 1, 0,
				(SOCKADDR*)&addrClient, len);
			cout << "Chat end!" << endl;
			break;
		}

		sprintf_s(tempBuf, 200, "%s say: %s",
			inet_ntop(AF_INET, &addrClient.sin_addr, str, sizeof(str)), len);
		cout << tempBuf << endl;

		//5.发送数据
		cout << "Please input data: " << endl;
		gets_s(sendBuf);
		sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len);
	}

	//6.关闭套接字
	closesocket(sockSrv);
	WSACleanup();

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_50188452/article/details/114700005