multithreading - 避免C中多个套接字的连接拒绝错误

标签 multithreading sockets connection

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

非常感谢您知道是否还有其他方法。谢谢

最佳答案

连接被拒绝并不是因为您要晚点接受,而是因为您要晚点监听。确保在进行任何连接调用之前先调用监听(可以使用strace进行检查)。这可能需要您在产生任何 child 之前先听一听。

调用监听后,套接字上的传入连接将排队,直到您调用接受为止。在某些时候,尚未接受的连接会被丢弃,但是只有2个或3个套接字不应该发生这种情况。

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

关于multithreading - 避免C中多个套接字的连接拒绝错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7135049/

相关文章:

wpf - WPF在一定程度上延迟了UI的更新

mysql - MySQL 连接中的 "Failed Attempt"

C 多线程值未打印

c++ - 类的std::thread调用方法

sockets - UDP 数据包丢失(LAN-Netcat),切换服务器-客户端数据包正常

Python 套接字错误 35

excel - ActiveX 组件无法创建对象 : 'TDApiOle80.TDConnection'

android - 通过蓝牙连接安卓手机和笔记本电脑

c# - asp.net多线程页面

sockets - Web套接字: Is it bad to always use SSL when making an online game?