【问题标题】:How to read/send packets correctly?如何正确读取/发送数据包?
【发布时间】:2015-05-06 02:10:18
【问题描述】:

我正在尝试通过 UDP 发送数据包,但不允许使用 SOCK_RAW(学校项目)。 我发送的数据包有一个标头结构 ip 和一个字符串数据部分。我将它们放入一个 char 数组中(数据包本身配置正确)。

我是这样发送的:

sendPacket(packet);

其中数据包是一个 char[] 和

其中 sendPacket 定义为:

void IPNode::sendPacket(char* packet){
        //define socket, destSockAddr
        int success = sendto(socket, packet, sizeof(packet), 0,
                (struct sockaddr *) &destSockAddr, sizeof(destSockAddr));
    }
}

数据包似乎是正确的。 不过,我是这样读的。

while (true) {
    struct sockaddr_in remoteAddr;
    socklen_t remoteAddrLen = sizeof(remoteAddr);
    char buffer[BUF_SIZE];
    int recvlen = recvfrom(myListenSocket, buffer, BUF_SIZE, 0, 0, 0);
    onReceive(buffer);
// other stuff

}

onReceive 在哪里:

void onReceive(char* packet) {
    ip* ptr = (ip*)packet; //the struct ip is the beginning of the packet
    struct ip ipCpy = *ptr;
    struct in_addr inAddrCpy = ipCpy.ip_src;
    char* ipString = inet_ntoa(inAddrCpy);
    cout << ipString << endl;
    return;
}

但是,打印的 ipString 与发送前数据包中的 ipString 不同。我是否错误地访问了接收到的数据包?

【问题讨论】:

  • 您需要将缓冲区和长度都传递给onReceive().

标签: c++ network-programming packet


【解决方案1】:

您正在发送 sizeof(packet) 字节。但是 sizeof(packet) 是 4,因为 packet 是一个指针。您需要一种更好的方法来跟踪您要发送的实际尺寸。

【讨论】:

  • 指针不一定是4字节,但是sizeof(char *)是指针的大小而不是所包含数据的长度。
  • 嗯,我把它改成了实际大小,现在它没有收到 0.0.0.0 但它仍然是错误的地址。
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多