2

服务器:
vxworks 6.3
调用通常的套接字、绑定、侦听,然后:

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

客户端:
.NET 2.0
TcpClient 构造函数连接到采用字符串主机名和 int 端口的服务器,例如:

TcpClient client = new TcpClient(server_ip, port);

当服务器在 windows (native c++) 中编译和执行时,这工作正常。

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

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

我尝试调整运行接受的线程的优先级,
我查看了“听”中队列的大小。够了。
可用的文件描述符的总数应该足够了(虽然还没有验证这一点,早上第一件事)

4

4 回答 4

1

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

于 2010-06-17T04:41:27.397 回答
0

这可能有很多原因,但是除非我们可以从服务器和客户端获取更多信息,否则我们不会知道。它会抛出任何错误吗?可以在此处找到 TCP/IP 错误列表Windows 套接字错误。在服务器端,您是否发现任何异常?也许您可以在出现错误后尝试关闭连接(逗留 1 秒)?

于 2010-06-15T07:01:39.757 回答
0

是否可以将服务器绑定到另一个端口并查看它是否接受?如果客户端返回,这听起来像是从您服务器上的某些东西那里获得了接受。我不了解 vxworks,但在 Windows 中,您应该始终尝试不绑定到 1000 以下的任何内容。

于 2010-06-18T14:31:55.067 回答
0

您的服务器accept()调用看起来不对。我知道的 POSIXaccept()调用有:

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 的指南没有提到任何 Windows 的accept()例外,所以这应该仍然适用。有点相关的是,Python accept() 调用也“返回”了该address字段(我之所以这么说,是因为 Python 尽最大努力模拟 C 网络 API,因为它是有意义的。)

我建议在服务器中调用后检查errno并使用,以查看是否已设置(如果您用完描述符,它也会通知您,如设置为or )perroraccept[EFAULT]errno[EMFILE][ENFILE]

如果这不是问题,请使用ncat作为服务器或客户端进行进一步调查。我会运行它,-vv因为您想确切地知道何时建立连接,发送了什么等等。

于 2010-06-19T10:31:30.197 回答