回声服务器代码不起作用

时间:2010-10-11 08:53:30

标签: c linux sockets

我有一些套接字代码可以在我的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 ....
}

也许我需要按下客户端地址? ......

1 个答案:

答案 0 :(得分:0)

我不认为字节顺序是你所展示的代码中的一个问题,并且在大端的PowerPC htons()等上无论如何都是no-ops(网络订单大端)!

我怀疑您在slen电话中使用recvfrom()。它是recvfrom()的输入输出参数,应该作为地址缓冲区的最大大小传入,并包含返回时获得的地址的实际大小。

如果slen的初始值(在您显示的循环之前)太小,则client_address recvfrom()中存储的地址将被截断。

因此slen应在调用sizeof(client_address)之前设置为recvfrom()。 (另外,您应确保使用正确大小的类型声明slen - POSIX uses socklen_t。)