【问题标题】:Sending and receiving data over Internet通过 Internet 发送和接收数据
【发布时间】:2015-07-07 12:31:45
【问题描述】:

这个问题不是关于如何完成的具体实现。它更多地是关于使用某种协议(TCP 或 UDP)通过 Internet 发送信息的概念和设计。我只知道需要套接字,但我想知道其余的。例如,在建立连接并通过该连接发送信息之后,另一端如何侦听特定端口并不断侦听? 是否在等待接收信息的后台线程中完成监听? (为了在等待信息的同时能够做其他事情/处理) 所以本质上,我认为这样一个应用程序如何在高层次上工作的真实示例足以解释数据流。例如在 Skype 中发送文件或类似的东西。

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

【问题讨论】:

  • '关于类似主题的大多数其他问题都是关于具体实现或某人的错误' - 是的,因为这些问题不是太宽泛。

标签: sockets send


【解决方案1】:

我目前在应用程序中使用带有 TCP 协议的 POSIX 套接字执行以下操作:

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

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

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

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

0001

在x86上,是一个

1000

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

【讨论】:

  • 感谢您的回复!这就是我在答案中寻找的。为了更清楚起见,我猜测服务器上的线程使用无限循环,不断尝试查找连接,当它找到连接时 - 它为连接的客户端启动第二个线程。那是对的吗?附:我会赞成你的回复,但我没有足够的代表,对不起。
  • 基本上是的。但是 connect() 函数将阻塞,直到有连接进入,所以不需要让线程进入睡眠状态。非常方便。
猜你喜欢
  • 2017-02-23
  • 2012-02-12
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多