通过Internet发送和接收数据

时间:2015-04-28 15:09:13

标签: sockets send

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

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

1 个答案:

答案 0 :(得分:1)

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

最重要的是:最多的功能是阻塞功能。因此,当您告诉服务器等待客户端连接时,该函数将阻塞,直到建立连接为止(如果您需要一次处理多个客户端的服务器,则需要使用线程!)

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

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

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

0001
x86上的

1000
在Power PC上

,从而产生8中的一个。所以你应该总是使用像ntohl这样的函数,一个htonl,它将数据从主机字节顺序转换为主机字节顺序和网络字节顺序(网络字节顺序是总是大端)。 希望这种帮助。如果有帮助,我也可以提供一些代码。