通过 Internet 发送和接收数据

Sending and receiving data over Internet

这个问题不是针对如何具体实现的。它更多地是关于使用某种协议(TCP 或 UDP)在 Internet 上发送信息的概念和设计。我只知道需要套接字,但我想知道其余的。例如,建立连接后,您通过它发送信息,但另一端如何监听特定端口并持续监听? 是否在等待接收信息的后台线程中进行监听? (为了等信息的时候可以做其他的things/processing) 所以从本质上讲,我认为这样一个应用程序如何在高层次上工作的真实世界的例子足以解释数据流。例如在 Skype 或类似的东西中发送文件。

P.S。关于类似主题的大多数其他问题都是关于具体实现或某人的错误。

我目前在一个应用程序中所做的是使用 POSIX 套接字和 TCP 协议:

最重要的是:大部分函数都是阻塞函数。所以当你告诉你的服务器等待客户端连接时,该函数将阻塞直到连接建立(如果你需要一个同时处理多个客户端的服务器,你需要使用线程!)

服务器侦听特定端口,直到客户端连接。连接后,您将获得一个新的套接字文件描述符以与客户端通信,同时初始套接字可以侦听新连接。然后我的服务器创建一个新线程来处理该客户端,同时等待初始套接字上的新连接。在新线程中,服务器等待来自客户端的请求命令(例如请求登录令牌)。服务器接收到请求后,服务器将收集其信息,使用 Google 协议缓冲区将其打包并发送给客户端。客户端现在要么告诉服务器终止会话(如果客户端收到它需要的每个数据),要么发送另一个请求。

这基本上就是我服务器中的想法。更大的问题是您传输和接收数据的方式。例如。您不能通过网络发送结构或 类(至少不能通过 C++),您需要某种序列化程序,并且必须确保另一部分知道要接收多少。所以我要做的是,首先通过包含传入包大小的线路发送一个 4 字节整数,然后使用序列化程序(在我的例子中是 Google 协议缓冲区)发送包本身。另一方等待 4 个字节可用,知道这将是传入包的大小。收到 4 个字节后,程序等待套接字上可用的确切数据量,当可用时,从缓冲区中读取数据并将其反序列化。当socket 30秒没有接收到数据时,触发超时并终止连接。

您始终需要注意的是系统的字节顺序。例如。当您直接通过线路发送整数时,大端系统(例如 PowerPC)和小端系统(例如 x86)会出现问题。例如a

0001

在 x86 上,是

1000

在 Power PC 上,因此从 1 中得到 8。因此,您应该始终使用像 ntohl 和 htonl 这样的函数,它将数据从主机字节顺序转换为网络字节顺序(网络字节顺序)顺序总是大端)。 希望这种帮助。如果有帮助,我也可以提供一些代码给你。