2013-06-13 117 views
0

我有一台服务器联系另一台服务器,用于检索客户端请求的文件。字节到与TCP套接字发送的字节

请求过程是:

Client ----> Server A ----> Server B 

发送文件的过程:

Server B ---> server A ----> client 

我不能直接将客户端连接到服务器B.

这是要求:

服务器A必须在客户端到达另一个客户端时转发到客户端文件数据服务器(无需等待整个文件的接收)。所以字节到字节到达。

其他信息:

TCP socket; 

Programming in C on Linux. 

可能有人请给我一些想法来实现这一点?

更新

这是我第一次尝试。

/* This code is refered to SERVER A */ 
/* s is the file descriptor for comunicate with SERVER B */ 
/* t is the file descriptor for comunicate with CLIENT */ 

int forward (int s, int t, char *buffer, size_t bytes){ 

    size_t n; 
    ssize_t nread; 
    ssize_t nsend; 
    char c; 

    for (n=1; n<bytes; n++) 
    { 
     nread=recv(s, &c, 1, 0); 
     if (nread == 1) 
     { 
      nsend = send(t,c,1,0); 
      if (nsend<=0) { 
       return (-1); 
      } 
     } 
     else if (nread == 0) 
     { 
      return (n-1); /* Errore */ 
     } 
     else 
      return (-1); /* Errore */ 
    } 
    return (n); 
} 
+0

首先试一下,这不是一个好问题。您需要使用多线程/处理C程序来为更多的客户端提供服务,并同时在服务器A上侦听并下载/上传。在服务器B上,您需要侦听来自服务器A的请求,然后发送数据B。马上重传数据。如果你需要更多的定制,使用UDP,而不是TCP。 – bartimar

+0

但是,您可以在B上安装B磁盘并让samba来处理这个问题吗? – bartimar

+1

您正在描述一个[netcat](http://en.wikipedia.org/wiki/Netcat)管道 –

回答

1

*所有服务器B首先应该在端口80用于HTTP连接收听(我们可以在这里使用XAMPP创建服务器)。

服务器A(充当代理服务器)应该在特定的端口上监听tcp连接,只要它从该端口处的客户端获得任何请求。首先连接到客户端,然后将请求传送到服务器B在dst-port 80通过建立一个tcp连接并等待来自服务器B的回复。

当服务器B收到请求时,它将数据转发到服务器A,然后服务器A转发到客户端。

对于制作一个tcp连接你可以参考beej guide的socket编程。这里给出一个简单的实现。 和一次有多个连接,你可以使用Pthreads创建线程,也可以使用fork()系统调用创建进程。*

+0

我希望你会编辑更多......为什么B要在80上听呢?这是无稽之谈...... – bartimar

+0

我们可以在B上运行任何服务器,使用xampp或其他一些其他的东西,在这里我们不需要任何类型的编程,只需要安装xampp即可。 – KJS

+0

服务器A的一个非常简单的JAVA实现在该链接中给出。 http://examples.oreilly.com/jenut/SimpleProxyServer.java – KJS

0

你应该尽可能地在每一个操作中尝试读取它更快。另外请注意,send()可能无法像您收到的那样发送,因此您必须循环执行send()操作,直到没有任何事件发生。

请注意,这是我用C编写了一个很长的时间前,所以你可能有如果你运行一个专门的线程,你可以直接跳过向前方法来改变变量类型等

int forward (int s, int t, char *buffer, size_t bytes){ 

    size_t index; 
    ssize_t bytesSent; 
    ssize_t bytesToSend; 
    ssize_t 

    while (true) { 
    { 
     bytesToSend = recv(s, buffer, bytes, 0); 
     if (bytesToSend <= 0) { 
      return bytesToSend; 
     } 

     index = 0; 
     while (bytesToSend > 0) { 
      bytesSent = send(t, (buffer + index), bytesToSend, 0); 
      if (bytesSent <= 0) { 
       return bytesSent; 
      } 
      bytesToSend -= bytesSent; 
      index += bytesSent 
     } 

    } 

    return 1; 
} 

bytesToRead检查外while,只使用while (1)

+0

如果通信速度慢(太多客户端正在下载)并且'B'只发送一些数据,然后等待并发送另一个数据(可能是' bytes ==缓冲区大小或更小)...'A'可以在recv超时返回-1,并且转发被破坏。所以当很多客户连接时,你总是可以超时并且不会转发任何东西。可以在另一个点(接收客户端数量)解决,但不要忘记,当recv返回-1时,它可能超时。 – bartimar

+0

为真。它应该返回1(成功),0(断开)或-1(超时) – jgauffin