如何正确读取/发送数据包

How to read/send packets correctly?

本文关键字:数据包 何正确 读取      更新时间:2023-10-16

我正在尝试通过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不同。我是否错误地访问了收到的数据包?

您发送的是sizeof(数据包)字节。但是sizeof(packet)是4,因为packet是一个指针。你需要一个更好的方法来跟踪你想要发送的实际大小。