服务器:
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 回答
您是否可以发布有关电线上发生的事情的wireshark / netmon?
这可能有很多原因,但除非我们能从服务器和客户端获得更多信息,否则我们不会知道 . 它会丢掉任何错误吗?可以在此处找到TCP / IP错误列表Windows Socket Error.在服务器端,您是否捕获任何异常?也许您可以在出错后尝试关闭连接(延迟1秒)?
是否可以将服务器绑定到另一个端口,看看它是否接受?如果客户端返回它听起来像是从服务器上的某些东西接受 . 我不知道vxworks,但在Windows中,你应该总是尝试不绑定到1000以下的任何东西 .
您的服务器
accept()
调用看起来不对 . 我知道的POSIXaccept()
电话有:其中
*addr
是一个必需的指针,如果调用有效,它将被写入 - 实际上,该调用的失败状态之一是:我没有'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 连接,发送什么等等 .