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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是WindowsC++实现UDP收发广播信息的示例代码: 发送端代码: ``` #include <iostream> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { // 初始化Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { cout << "WSAStartup failed: " << iResult << endl; return 1; } // 创建socket SOCKET sendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sendSocket == INVALID_SOCKET) { cout << "Failed to create socket: " << WSAGetLastError() << endl; WSACleanup(); return 1; } // 设置广播属性 BOOL bOptVal = TRUE; iResult = setsockopt(sendSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, sizeof(BOOL)); if (iResult == SOCKET_ERROR) { cout << "setsockopt failed: " << WSAGetLastError() << endl; closesocket(sendSocket); WSACleanup(); return 1; } // 设置目标地址 SOCKADDR_IN destAddr; destAddr.sin_family = AF_INET; destAddr.sin_port = htons(12345); destAddr.sin_addr.s_addr = INADDR_BROADCAST; // 发送数据 char sendBuf[] = "Hello, this is a broadcast message"; iResult = sendto(sendSocket, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&destAddr, sizeof(destAddr)); if (iResult == SOCKET_ERROR) { cout << "sendto failed: " << WSAGetLastError() << endl; closesocket(sendSocket); WSACleanup(); return 1; } // 关闭socket closesocket(sendSocket); WSACleanup(); return 0; } ``` 接收端代码: ``` #include <iostream> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { // 初始化Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iResult != 0) { cout << "WSAStartup failed: " << iResult << endl; return 1; } // 创建socket SOCKET recvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (recvSocket == INVALID_SOCKET) { cout << "Failed to create socket: " << WSAGetLastError() << endl; WSACleanup(); return 1; } // 设置广播属性 BOOL bOptVal = TRUE; iResult = setsockopt(recvSocket, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, sizeof(BOOL)); if (iResult == SOCKET_ERROR) { cout << "setsockopt failed: " << WSAGetLastError() << endl; closesocket(recvSocket); WSACleanup(); return 1; } // 设置本地地址 SOCKADDR_IN localAddr; localAddr.sin_family = AF_INET; localAddr.sin_port = htons(12345); localAddr.sin_addr.s_addr = INADDR_ANY; // 绑定socket iResult = bind(recvSocket, (SOCKADDR*)&localAddr, sizeof(localAddr)); if (iResult == SOCKET_ERROR) { cout << "Failed to bind socket: " << WSAGetLastError() << endl; closesocket(recvSocket); WSACleanup(); return 1; } // 接收数据 char recvBuf[1024] = { 0 }; SOCKADDR_IN fromAddr; int fromLen = sizeof(fromAddr); iResult = recvfrom(recvSocket, recvBuf, sizeof(recvBuf), 0, (SOCKADDR*)&fromAddr, &fromLen); if (iResult == SOCKET_ERROR) { cout << "recvfrom failed: " << WSAGetLastError() << endl; closesocket(recvSocket); WSACleanup(); return 1; } // 显示收到的数据 cout << "Received message: " << recvBuf << endl; // 关闭socket closesocket(recvSocket); WSACleanup(); return 0; } ``` 这个示例代码实现了在本地网络中发送广播消息,并在另一台机器上接收。要注意的是,如果有多台机器在同一个局域网下运行这个示例代码,那么它们都会收到这个广播消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就喝白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值