我有一些套接字代码可以在我的Linux机器上运行但在我的PowerPC机箱上运行FAILS。
代码(在Linux机器上工作时)从客户端接收数据,然后将数据发送回客户端。使用两个netcat应用程序进行测试时 - 数据已成功包装。
问题:在PowerPC(运行VxWorks)上进行测试时,客户端永远不会收到回显数据...(netcat和wireshark什么都没有显示)。
在PowerPC上,服务器成功接收数据(来自x86客户端)并声称它已成功回收...但客户端没有收到数据(x86上的netcat)...我想我可能在某个地方犯了一些ENDIAN foobar。以下是PowerPC上存在的代码段。使用两个x86 Linux机箱,代码工作正常......
while(1)
{
readlen = recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *) &client_address, &slen);
if (readlen == ERROR)
{
printf("RECVFROM FAILED()/n");
return (ERROR);
}
printf("Received %d bytes FROM %s:%d\nData: %s\n\n",
readlen, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port), buf);
// Send it to right back to the client using the open UDP socket
// but send it to OUTPORT
client_address.sin_port = htons(OUTPORT);
sendlen = sendto(sock, buf, BUFLEN, 0, (struct sockaddr *)&client_address, slen);
// more code ....
}
也许我需要按下客户端地址? ......
答案 0 :(得分:0)
我不认为字节顺序是你所展示的代码中的一个问题,并且在大端的PowerPC htons()
等上无论如何都是no-ops(网络订单是大端)!
我怀疑您在slen
电话中使用recvfrom()
。它是recvfrom()
的输入输出参数,应该作为地址缓冲区的最大大小传入,并包含返回时获得的地址的实际大小。
如果slen
的初始值(在您显示的循环之前)太小,则client_address
recvfrom()
中存储的地址将被截断。
因此slen
应在调用sizeof(client_address)
之前设置为recvfrom()
。 (另外,您应确保使用正确大小的类型声明slen
- POSIX uses socklen_t
。)