C# tcp/ip接受不返回,但客户端接受

C# tcp/ip接受不返回,但客户端接受,c#,.net,c#-2.0,tcp,vxworks,C#,.net,C# 2.0,Tcp,Vxworks,服务器: vxworks 6.3 调用常用套接字、绑定、侦听,然后: 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++)

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

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共享时,当客户端尝试连接时,更可能出现这种症状,但当客户端不连接时,也可能出现这种症状

我已尝试调整运行accept的线程的优先级
我已经在“listen”中查看了队列的大小。足够了。

可用的文件描述符的总数应该足够了(不过还没有验证,早上的第一件事)

可能有很多原因,但是除非我们能够从服务器和客户端获得更多信息,否则我们无法知道。它会抛出任何错误吗?在服务器端可以找到TCP/IP错误列表,您是否捕获到任何异常?可能您可以在连接出错后尝试关闭连接(延迟1秒)

您是否可以发布wireshark/netmon,说明线路上发生了什么

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

您的服务器的
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 socket编程,但我知道它符合POSIX标准,而且Beej的指南没有提到Windows for的任何例外情况,所以这应该仍然适用。Python accept()调用有点相关(我说这是因为Python尽了最大努力模拟C网络API,因为它是有意义的)

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


如果未证明这是问题所在,请使用服务器或客户端进行进一步调查。我会用
-vv
运行它,因为您想知道连接的确切时间、发送的内容等。

这正是问题所在-没有错误!客户端愉快地返回TcpClient实例,但服务器从不从accept返回。在服务器端,没有例外,因为套接字库是C库,而不是C++。我开始尝试编写自己的协议,通过立即将数据发送回客户机来确认接受是否有效,如果在一段固定时间后我没有收到数据,我会尝试再次连接……但这将是一个多么困难的问题啊!附议。这将隔离问题是在客户端还是服务器端,从而将查找位置的数量减少一半。这应该是一个评论,而不是一个答案吗。Wireshark将是非常有帮助的反馈这看起来像是我要走的路…我不想,希望有人会提到这样的话-'哦,TcpClient不适用于vxWorks,你已经在里面安装了套接字并设置了标志xyz或其他东西'…哦,好吧。清理不被接受的答案-这是最接近的,因为这有助于调查。问题是netStackSysPool在vxWorks中不够大。我使用的套接字不是POSIX合规性的一部分(它们不是unix域套接字),它们是internet套接字或“BSD”套接字,它们不是POSIX的一部分。根据,accept的第二个参数是可选的。如果不关心客户机的实际地址,可以传递NULL。如果它不被允许,它仍然会返回一个错误,而我的没有。你是否设法弄清楚这里发生了什么?没有我已经向WindRiver(vxworks)提出了这方面的支持请求。我做了wireshark跟踪,当它发生时,我看到了正确的SYN和SYN,ACK,所以windows做了正确的事情。但是,它从未在我们部署的目标上出现过,这可能是一个侥幸,这就是为什么我们使用它这么长时间的原因…上一个IP帧是上一个数据流上的RST,ACK-也许这就是问题所在,在vxworks端…当您使用无参数构造函数,然后调用Connect(addr,port)时,端口>1000。它有用吗?