Tcp 树莓皮:endianness交叉编译

Tcp 树莓皮:endianness交叉编译,tcp,raspberry-pi,endianness,tcpserver,buildroot,Tcp,Raspberry Pi,Endianness,Tcpserver,Buildroot,我使用buildroot交叉工具链从我的计算机Ubuntu X86编译Raspberry应用程序。 我正在开发一个TCP服务器,它允许在5003 0x138B TCP端口号上进行连接。当我启动服务器时,这是正确的,但是我的服务器在35603 0x8B13 TCP端口号上等待连接,请使用netstat-a进行检查 这似乎是一个长期的问题,但我不知道如何解决 你能帮我吗 谢谢。谢谢你的回答 我同意这很奇怪。我认为代码不是问题所在。它在其他平台上运行良好 请查找以下代码: /*Create the s

我使用buildroot交叉工具链从我的计算机Ubuntu X86编译Raspberry应用程序。 我正在开发一个TCP服务器,它允许在5003 0x138B TCP端口号上进行连接。当我启动服务器时,这是正确的,但是我的服务器在35603 0x8B13 TCP端口号上等待连接,请使用netstat-a进行检查

这似乎是一个长期的问题,但我不知道如何解决

你能帮我吗


谢谢。

谢谢你的回答

我同意这很奇怪。我认为代码不是问题所在。它在其他平台上运行良好

请查找以下代码:

/*Create the server */
int CreateServeur (unsigned short port, int *sock_srv, int nb_connect)  
{
  int l_ret = -1;   
  struct sockaddr_in l_srv_addr;  

  /* address initialisation */
  printf("creation serveur port %i\n", port);
  memset ((char*) &l_srv_addr,0, sizeof (struct sockaddr_in));
  l_srv_addr.sin_family      = PF_INET;
  l_srv_addr.sin_port        = port;
  l_srv_addr.sin_addr.s_addr = htonl (INADDR_ANY);

  /* main socket creation */
  if ((*sock_srv = socket (PF_INET, SOCK_STREAM, 0)) <= 0)
  {
    printf("server socket creation error");
  }
  else
  {
    if (bind (*sock_srv, (struct sockaddr *) &l_srv_addr, sizeof (struct sockaddr_in)) == -1)
    {
        close (*sock_srv);
        printf("bind socket error");
    }
    else
    {
        if (listen (*sock_srv, nb_connect) == ERROR)
        {
            close (*sock_srv);
            printf("listen socket error");
        }
        else
        {
            l_ret = 0;
        }
    }
  }

  return (l_ret);
}
此函数不返回任何错误。第一个日志printfcreation服务器端口%i\n,端口;显示良好的端口5003,但服务器在端口35603 netstat-a上等待连接


如果这不是一个持久性问题,我不明白。

在你的代码中了解ntohs、ntohl和朋友。那么你的代码就是问题所在……它不是endian安全的。不知道这是否是正确的英语术语。请显示设置套接字的代码。我在下面添加了一个答案。你需要将数据从网络数据包endianness big endian翻译到主机,具体取决于建筑学请参阅ntohl和htonlI未收到来自网络的数据,因为5003端口上的连接失败。服务器端口是固定的。问题是服务器没有在良好端口上等待连接,而是在端口35603上等待连接。ntohs35603==5003。得出适当的结论我理解你的结果,但不理解为什么我必须使用ntohs函数,即使这个解决方案解决了我的问题。在我看来,字节交换只用于网络数据接收。您能确认吗?第三次,您需要使用它来发送和接收数据。这就是TCP的工作原理。去看看吧