如何知道何时从客户端服务器c ++发送/ recv字节

时间:2011-02-16 09:47:27

标签: networking network-programming

我的问题是,当你有一个代理服务器,你需要发送/ recv与客户端和发送/ recv与远程服务器你怎么知道在哪一端有数据要发送/ recv所以我可以调用相应的功能。 我需要从一个网站收发/发送字节到客户端(通过代理)和从客户端到服务器(通过代理),但我不知道它们将以什么顺序出现,我看到大多数网站都有所不同。登记/> 我目前的实施是:

1) receive from client
2) send to server
//infinite loop here
3) receive from server
4) send to client
// until bytes from server is 0

这适用于少数网站,并且不会完全加载它们,只有15-20 KB 有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您的任务是将数据从客户端转发到服务器并返回。由于客户端和服务器可以同时传输数据,当您从客户端读取所有内容而不是将其传递给服务器时接近,反之亦然无效:在等待客户端开始传输时考虑情况,客户端在启动传输之前想要从服务器获取数据自己的传输。
因此,有以下方法可以使其发挥作用:

  1. 构建两个显式管道 - 一个从客户端到服务器,另一个从服务器到客户端。这将需要4个线程 - 一个从客户端读取并将数据传递给其他写入服务器,反之亦然。这样做的缺点是每个客户端有4个线程,这限制了代理可以支持的并发客户端数量。
  2. 使用select(2)功能(或来自Windows API的类似sys调用)+非阻塞套接字。这将告诉您何时需要读取或写入数据。如果要为每个线程提供多个客户端,则需要非阻塞套接字,因此线程不会在读/写系统调用中被阻塞。
    手册页中有select样本,互联网上有很多信息。
  3. 一个致力于服务器开发的着名页面是here

答案 1 :(得分:0)

从客户处收到 发送到服务器 而(真) { if(recvfrom服务器不为零) 发送给客户 if(recvfrom客户端不为零) 发送到服务器 }

我认为这可能有用..

答案 2 :(得分:0)

使用select()等待数据从任何一方获得,然后阅读并传递它。