2011-08-20 52 views
1

只是一个简单的背景。我愿意为应用程序的每个线程打开两个套接字。主线程有accept()调用来接受TCP连接。还有另外三个线程,它们都有accept()。问题有时在多线程环境中,客户端尝试在导致“连接被拒绝”错误的子线程中接受服务器调用之前进行连接。客户端不知道服务器何时准备连接 我不希望主线程套接字将任何控制信息发送到客户端,如“您现在可以连接到服务器”。为了避免这种情况,我在脑海中有两种方法 1.在连接拒绝错误退出之前,在客户端设置最大计数器(尝试)以连接到服务器。 2.一个单独的线程,其唯一的功能是接受服务器端的连接,作为除主线程外的所有线程连接的公共接受函数。C中的多个套接字避免连接拒绝错误

真的很感激知道是否有其他方法。谢谢

+0

你已经事先调用'listen()'来设置传入连接的队列大小,对吧? (AFAIK,不听不接受根本不应该工作,但是因为你没有公开你正在使用哪个操作系统,它可能是一个决定“有帮助”的人,并且在第一次接受时做一个隐含的listen() ))。 –

+0

Hello @HenningMakholm, 感谢您的评论。我添加了充足的队列大小的听力。另外,我所使用的操作系统是Linux 2.6.18.它只是主线程没有任何问题连接,但其他线程随机具有此连接拒绝错误。我不希望线程相互等待,因为它会挫败使用线程的目的和应用程序的目标。您的意见非常感谢 Thnks – user369823

回答

0

连接被拒绝并不是因为你打电话接受迟到,这是因为你打电话过迟。确保您在任何连接呼叫之前拨打电话(您可以使用strace进行检查)。这可能需要你在产卵前仔细聆听。

在您调用套接字监听之后,传入的连接将排队,直到您调用call accept。在某些时候,未接受的连接可能会丢失,但这不应该发生在只有2个或3个套接字的情况下。

如果这是unix,您可以使用pipe2或socketpair创建一对连接的管道/ unix域套接字,代码少得多。当然,您需要在产生子线程并将一端传递给子进程之前执行此操作。