首页 > 解决方案 > 一个用于发送和接收数据包的 TCP 套接字

问题描述

下午好。任务是编写一个程序,该程序将在不同网络的两台机器上运行。该程序应与另一个网络上的同一程序建立 TCP 连接,并且它们应交换数据包。这是我第一次遇到这样的任务,所以出现了一些困难。

在经典的客户端/服务器架构中,有一个用于接收消息的套接字和一个用于发送消息的套接字。由于我的程序实际上结合了客户端和服务器,所以问题是 - 是否可以在同一个 TCP 套接字上实现接收和发送?

逻辑如下 - 我们创建一个 tcp 套接字(在 sockaddr_in 中我们填写本地机器的 Ip 和端口),我们进行绑定,然后我们进行监听。然后我们进行连接(在 sockaddr_in 中,填写我们要连接的第二台机器的 Ip 和端口)并接受。结果是connect,我们向第二台机器上的listen队列发送一个请求,然后,通过accept,我们把这个请求拉出队列,得到一个socket描述符,通过它我们已经在发送和接收消息了。

这个逻辑会起作用,还是你需要做一些不同的事情?

非常感谢。

标签: c++socketstcp

解决方案


正如 Abhinav 所说,您应该使用命令行来指定您希望程序具有的行为。一个好的方法是:

$ my_program :28728      # try to listen as a server on port 28728
$ my_program hostname:28728    # try to connect as a client

int main(int argc, const char* argv[])您可以从->中找到命令行参数if (argc == 2)然后argv[1]会有一些文本,您可以查看第一个字符是否为 ':' 以了解运行程序的模式。

对于 TCP 服务器模式,创建一个、 和socket一个bind客户端连接。对于 TCP 客户端模式,创建一个和到服务器。listenacceptsocketconnect

连接后,TCP 连接是对等连接,双方都有权使用send()和发送和接收数据recv()

每当我想编写这种代码时,我都会求助于 GCC libc 示例:https ://www.gnu.org/software/libc/manual/html_node/Server-Example.html和https://www.gnu。 org/software/libc/manual/html_node/Byte-Stream-Example.html来提醒我所有的步骤。


推荐阅读