是否可以创建一个SYN数据包然后使用socket send()函数传输它?

时间:2013-03-11 18:08:10

标签: c++ sockets

所以我目前正在编写一个C ++程序,它是一个点对点的即时通讯工具。因此,当程序启动时,它会侦听指定端口上的传入连接,但也允许用户通过输入其IP地址来启动与其他主机的连接。现在套接字 connect()函数AFAIK的工作方式与 send()函数非常相似,但它会传输一个SYN数据包,直到服务器以 accept()响应或者如果服务器拒绝连接,则关闭。所以主要的问题是.......如果我创建一个套接字然后调用listen()函数,如果我在同一个端口上调用connect函数,我会得到一个错误吗?如果是这样,有没有办法创建一个SYN数据包,然后调用 send()函数将其传输到指定的主机?此程序偏离客户端 - 服务器模型,因为运行此程序的任何主机都将充当客户端和服务器。

2 个答案:

答案 0 :(得分:2)

套接字可以listenconnect。它不能同时做到这两点。

如果您希望每个主机都是客户端和服务器,那么每个主机都需要两个套接字。

至少在MacOS X上,您在connect(2)手册页中尝试执行的操作有一条特定的错误消息:

  

[EOPNOTSUPP]因为套接字正在侦听,所以不允许连接。

答案 1 :(得分:2)

  

现在套接字connect()函数AFAIK的工作方式与send()函数非常相似,但是它会传输一个SYN数据包,直到服务器以accept()响应,或者服务器拒绝连接关闭

一开始就不正确。 connect()可以发送SYN,但ACK回复来自对等TCP堆栈,可能早在服务器应用程序接近调用accept()之前。这是因为监听积压队列。

所以你的动机已经被怀疑了。

  

如果我创建一个套接字然后调用listen()函数,如果我在同一个端口上调用connect函数,是否会出错?

是。你不能这样做。你没有激发这个问题,但你甚至不需要这样做。您无需为正在侦听入站连接的出站连接使用相同的本地端口。

  

有没有办法创建一个SYN数据包,然后调用send()函数将其传输到指定的主机?

如果您可以了解如何创建原始IP套接字,则可以手动发送SYN,但是您无法通过TCP / IP将其识别为TCP连接的一部分。再次,这与你的问题无关。

我甚至不相信你实际上有问题。您只需要一个侦听套接字,接受的套接字和用于出站连接的套接字,所有这些都是以通常的方式创建的。不需要技巧。