【发布时间】: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