2010-06-09 54 views
2

服务器:
的VxWorks 6.3
调用常用的插座,绑定,听,然后:TCP/IP接受不返回,但客户端不

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

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

TcpClient client = new TcpClient(server_ip, port); 

这是工作正常时,s erver是在windows(native C++)中编译和执行的。

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

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

我试着调整线程运行accept的优先级
我已经看过'listen'队列的大小。够了。
文件描述符的可用的总数量应该足够(没有验证这个尚未虽然,在早晨的第一件事)

+0

你有没有设法弄清楚这里发生了什么? – Default 2010-09-08 10:11:10

+0

没有。 - 我有一个与WindRiver(vxworks)开放的支持请求。我做了Wireshark跟踪,当它发生时,我看到了正确的SYN和SYN,ACK,所以窗户做得对。但它从来没有出现在我们的部署目标上,这可能是一种侥幸,这就是为什么我们已经与它共存了这么久......以前的IP帧是RST,在之前的数据流中是ACK - 也许这就是问题所在,在vxworks端...端口> 1000 – paquetp 2010-09-08 17:49:26

+0

当您使用无参数构造函数,然后调用Connect(addr,port)。它工作吗? – Kugel 2011-07-12 12:43:49

回答

1

是否可以发布wireshark/netmon上发生的事情?

+0

借调。这将隔离问题是在客户端还是服务器端,将查找的位数减半。这应该是一个评论,而不是一个答案? – Slartibartfast 2010-06-17 04:49:35

+0

第三。 Wireshark将是非常有用的反馈 – Default 2010-06-18 14:15:59

+0

这看起来像我要去的方式......不想,希望有人会提到像 - '哦,TcpClient不适用于vxWorks,你有你得到内部的插座,并设置标志xyz或什么'...哦。 – paquetp 2010-06-19 12:18:13

0

这可能是很多原因,但我们不会知道,除非我们能够得到更多的信息服务器和客户端。它是否抛出任何错误?可以在这里找到TCP/IP错误列表Windows Socket Error.在服务器端,您是否捕获任何异常?也许你可以在出现错误后尝试关闭连接(连续1秒)?

+0

这就是问题 - 没有错误!客户端愉快地返回TcpClient实例,但服务器永远不会从accept返回。在服务器端,不会有例外,因为套接字库是C库,而不是C++。我开始着手编写自己的协议来确认接受的工作,立即将数据发送回客户端,如果我在一段固定的时间后没有得到它,我尝试再次连接...但是这将是一个什么kludge! – paquetp 2010-06-16 11:33:59

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. 

我没有完成Windows套接字编程,但我知道它符合POSIX标准,Beej的指南没有提到Windows的任何例外情况,因此它应该仍然适用。有点相关,Python accept()调用also 'returns' the address field(我说有点说,因为Python尽力模拟C网络API,因为它是有意义的。)

我建议检查errno和服务器accept电话后使用perror,看是否[EFAULT]设置(它也将告诉你,如果你跑出来的描述符,为errno被设置为[EMFILE][ENFILE]

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

+0

我使用的套接字不是POSIX合规性的一部分(它们不是unix域套接字),它们是互联网套接字或'BSD'套接字,它们不是POSIX的一部分。 accept的第二个参数是可选的,如http://opengroup.org/onlinepubs/007908799/xns/accept.html所示。如果您不关心客户端的实际地址是什么,则可以传递NULL。如果不允许,它仍然会返回一个错误,而我的错误不会。 – paquetp 2010-06-19 11:53:23

相关问题