c++ udp单播,并指定本地发送端口号

 初始化SOCKET:

    //初始化广播Socket
	WSADATA wsdata;
	WSAStartup(MAKEWORD(2, 2), &(wsdata));

	m_socketHmv = socket(AF_INET, SOCK_DGRAM, 0);
	if (m_socketHmv != INVALID_SOCKET)
	{
		BOOL opt = TRUE;
		int optret = setsockopt(m_socketHmv, SOL_SOCKET, SO_BROADCAST, (char* FAR)&opt, sizeof(opt));
		
		//发送addr
		USES_CONVERSION;
		LPCSTR cClirntIp = (LPCSTR)T2A(m_strHmvClientIp);
		memset(&m_addrtoHmv, 0, sizeof(m_addrtoHmv));
		m_addrtoHmv.sin_family = AF_INET;
        //cClirntIp为接收端的IP
		m_addrtoHmv.sin_addr.S_un.S_addr = inet_addr(cClirntIp);
        //cClirntIp为接收端的Port
		m_addrtoHmv.sin_port = htons(m_nUdpPortHmv);

		//本地addr
 		memset(&m_addrLocal, 0, sizeof(m_addrLocal));
 		m_addrLocal.sin_family = AF_INET;
		m_addrLocal.sin_addr.s_addr = htonl(INADDR_ANY);
        //本地port
		m_addrLocal.sin_port = htons(m_nLocalPort);
		
		//设置可以多次绑定
		int nRecvBuf = 1;
		optret = setsockopt(m_socketHmv, SOL_SOCKET, SO_REUSEADDR, (const char*)&nRecvBuf, sizeof(int));

        //绑定本地发送使用端口,这样,本地发送udp消息时,就是从这个端口发送出去的
		if (!bind(m_socketHmv, (sockaddr*)&m_addrLocal, sizeof(m_addrLocal)) != SOCKET_ERROR)
			ASSERT(0); 
	}

发送:

    //根据具体需要构建数据
	int nLength = 200;
	unsigned char* pData = new unsigned char[nLength];
	.......

	if (sendto(m_socketHmv, (char*)pData, nLength, 0, (sockaddr*)&m_addrtoHmv, sizeof(m_addrtoHmv)) == SOCKET_ERROR)
		ASSERT(0);
	delete pData;

 

### C++ 实现 UDP 单播 #### 创建套接字 为了创建一个UDP单播客户端,首先需要初始化一个套接字。这可以通过调用`socket()`函数来完成,该函数返回一个新的文件描述符用于后续操作。 ```cpp #include <sys/socket.h> #include <arpa/inet.h> int sockfd; if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { perror("Socket creation failed"); } ``` #### 设置服务器地址结构 接着定义目标服务器的信息,包括IP地址和端口号。这些信息被封装在一个`sockaddr_in`类型的变量中[^1]。 ```cpp struct sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); inet_pton(AF_INET, "SERVER_IP", &server_addr.sin_addr); ``` #### 发送数据包至服务器 使用`sendto()`函数向指定的目标发送数据报文。此过程不需要建立连接,因为UDP是一种无连接协议。 ```cpp const char* message = "Hello Server"; ssize_t bytes_sent = sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (bytes_sent == -1){ perror("Send failed"); } ``` #### 接收来自服务器的数据 当期望从服务器获取反馈时,可以利用`recvfrom()`函数读取传入的消息。需要注意的是,在实际应用中应当处理可能发生的错误情况以及超时机制。 ```cpp char buffer[BUFFER_SIZE]; socklen_t addr_len = sizeof(struct sockaddr); ssize_t bytes_received = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&server_addr, &addr_len); if (bytes_received == -1){ perror("Receive failed"); } else { printf("Received response from server: %s\n", buffer); } ``` 关闭套接字以释放资源: ```cpp close(sockfd); ``` 上述代码片段展示了基本的UDP单播通信流程,其中包含了必要的错误检测逻辑。对于更复杂的应用场景,则需考虑更多细节如发控制、异常处理等[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值