【发布时间】:2012-10-26 23:52:08
【问题描述】:
我设置了一个套接字来接受 TCP 连接
socket(AF_INET, SOCK_STREAM, 0)
然后我打电话给bind()、listen() 和accept()
问题是当我调用listen() 时,它会导致向客户端发送一个SYN/ACK 数据包。我以为直到我调用了 accept() 才会发生这种情况,但更糟糕的是 SYN/ACK 数据包没有确认增加一。
这是什么原因造成的,我该如何解决?
谢谢
附带说明 - 我的 TCP 连接不对称是否重要?
【问题讨论】:
-
如果这是主流的 TCP 实现,不太可能是行为不端。客户端是否在服务器调用 listen() 之前尝试连接?如果是这样,并且它没有超时,那么可能有点不寻常(但绝不是非法)的事件顺序意味着正确的行为与您的预期有些不同。
-
嗯,确实如此。我实际上是在拦截一些流量,并在客户端尝试连接之后(客户端是 wget)站起来监听()。这有点像我正在尝试实现的即时端口转发
-
发布一个导致问题的最小示例。
-
@Derek 你看起来很困惑。通常每个接受的套接字都有一个线程,即每个客户端,所以没有什么可以混淆的。
-
所以你仍然需要每个套接字一个线程,也许两个,一个读,一个写。或者可能使用 poll()。您当然不希望多个线程写入同一个套接字:交错可能以任何方式发生。你所知道的是,每个 send() 都是原子的,即所有数据都放在一起。
标签: c sockets network-programming freebsd