首页 文章

tcp / ip接受不返回,但客户端确实如此

提问于
浏览
2

服务器:
vxworks 6.3
调用通常的socket,bind,listen,然后:

for (;;)
{
  client = accept(sfd,NULL,NULL);
  // pass client to worker thread
}

客户:
.NET 2.0
TcpClient构造函数连接到服务器,该服务器接受字符串hostname和int port,如:

TcpClient client = new TcpClient(server_ip, port);

当在Windows(本机c)中编译和执行服务器时,这工作正常 .

间歇性地,TcpClient的构造函数将返回实例,而不会抛出任何异常,但vxWorks中的accept调用不会返回客户端fd . tcpstatShow表示没有发生接受 .

什么可能使TcpClient构造函数(调用'Connect')返回实例,而服务器上的accept调用不返回?它似乎与系统在后台执行的操作有关 - 当客户端尝试连接时服务器忙于将数据保存到闪存或NFS共享时,似乎更容易出现此症状,但是当它发生时可能会发生这种情况不是也 .

我已经尝试调整运行接受的线程的优先级
我've looked at the size of the queue in '听了'. There'够了 .
可用的文件描述符总数应该足够(但尚未验证这一点,早上的第一件事)

4 回答

  • 1

    您是否可以发布有关电线上发生的事情的wireshark / netmon?

  • 0

    这可能有很多原因,但除非我们能从服务器和客户端获得更多信息,否则我们不会知道 . 它会丢掉任何错误吗?可以在此处找到TCP / IP错误列表Windows Socket Error.在服务器端,您是否捕获任何异常?也许您可以在出错后尝试关闭连接(延迟1秒)?

  • 0

    是否可以将服务器绑定到另一个端口,看看它是否接受?如果客户端返回它听起来像是从服务器上的某些东西接受 . 我不知道vxworks,但在Windows中,你应该总是尝试不绑定到1000以下的任何东西 .

  • 0

    您的服务器 accept() 调用看起来不对 . 我知道的POSIX accept() 电话有:

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    

    其中 *addr 是一个必需的指针,如果调用有效,它将被写入 - 实际上,该调用的失败状态之一是:

    [EFAULT]    The address parameter is not in a writable part of the user address space.
    

    我没有't done Windows socket programming, but I understand it'符合POSIX标准,并且Beej 's guide doesn' t为accept()提到了Windows的任何例外,所以这仍然适用 . 有点相关,Python accept()调用also 'returns' the address field(我说有点自从Python尽力模仿C网络API,因为它有意义 . )

    我建议在服务器的 accept 调用之后检查 errno 并使用 perror 来查看 [EFAULT] 是否已设置(如果 errno 设置为 [EMFILE][ENFILE] ,它也将通知您是否用完了描述符)

    如果 doesn't 证明是问题,请使用ncat作为服务器或客户端进一步调查 . 我用 -vv 运行它,因为你想知道什么时候 Build 连接,发送什么等等 .

相关问题