服务器:
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共享时,似乎更有可能出现此症状,但是当它发生时可能会发生这种情况也不是。
我已经尝试调整运行接受的线程的优先级
我在'listen'中查看了队列的大小。够了。
可用的文件描述符总数应该足够(但尚未验证这一点,早上的第一件事)
答案 0 :(得分:1)
您是否有可能发布有关电线上发生的事情的wireshark / netmon?
答案 1 :(得分:0)
可能有很多原因,但除非我们能从服务器和客户端获得更多信息,否则我们不会知道。它会丢掉任何错误吗?可以在此处找到TCP / IP错误列表Windows Socket Error.在服务器端,您是否捕获任何异常?也许您可以在出错后尝试关闭连接(延迟1秒)?
答案 2 :(得分:0)
是否可以将服务器绑定到另一个端口并查看它是否接受?如果客户端返回它听起来像是从服务器上的某些东西接受。 我不知道vxworks,但在Windows中,你应该总是尝试不绑定到1000以下的任何东西。
答案 3 :(得分: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.
我还没有完成Windows套接字编程,但我知道它符合POSIX标准,而且Beej的指南没有提到accept()的Windows的任何例外,所以这仍然适用。有点相关,Python accept()调用also 'returns' the address
field(我说有点,因为Python尽力模拟C网络API,因为它有意义。)
我建议在服务器errno
调用后检查perror
并使用accept
,看看是否设置了[EFAULT]
(如果你运行,它也会通知你超出描述符,因为errno
设置为[EMFILE]
或[ENFILE]
)
如果不证明是问题,请使用ncat作为服务器或客户端进一步调查。我用-vv
运行它,因为你想知道连接的确切时间,发送的内容等等。