修改以上代码,改成从192.168.1.112这个IP收数据,将数据放到receivedata这个数组中,将数据长度记录到变量datalen中
时间: 2024-10-11 07:03:51 浏览: 20
要修改这段代码,使其从特定IP(192.168.1.112)接收数据并将数据存入`receivedata`数组,你需要更新`bind()`和处理数据的部分。假设`receivedata`是一个动态大小的数组,下面是如何调整的:
```c++
// 修改bind部分,指定接收地址
struct sockaddr_in destinationAddr;
destinationAddr.sin_family = AF_INET;
destinationAddr.sin_addr.s_addr = inet_addr("192.168.1.112"); // 使用inet_addr替换INADDR_ANY
destinationAddr.sin_port = htons(44818); // 确保端口不变
bind(m_broadcastSockt, (SOCKADDR*)&destinationAddr, sizeof(destinationAddr));
// 添加数据接收处理
char receivedata[1024]; // 假设最大接收长度为1024字节
socklen_t datalen = sizeof(receivedata);
while (true) {
ssize_t bytesReceived = recvfrom(m_broadcastSockt, receivedata, datalen, 0, NULL, NULL); // 使用recvfrom而非直接bind
if (bytesReceived > 0) {
receivedata[bytesReceived] = '\0'; // 数据结束标志
datalen = bytesReceived;
// 将数据添加到数组或其他合适的数据结构中
// receivedata[datalen - 1] = ' '; // 可选,添加分隔符便于查看
printf("Received %d bytes from 192.168.1.112: \n%.*s\n", datalen, receivedata);
} else if (bytesReceived == 0) { // 如果收到0字节,通常意味着连接关闭
break;
} else if (errno != EAGAIN && errno != EWOULDBLOCK) { // 检查错误,除了EAGAIN和EWOULDBLOCK外,其他情况需要处理
perror("Error receiving data");
break;
}
}
```
这里我们使用了`recvfrom()`函数代替之前的`bind()`,它不仅能接收广播数据,还能提供发送方的信息,如地址和端口。然后我们在循环中不断读取数据,直到数据全部接收完毕或者遇到错误。
阅读全文