0

我有一台服务器与另一台服务器联系以检索客户端请求的文件。

请求过程是:

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);
}
4

2 回答 2

1

*首先服务器 B 必须在 80 端口监听 http 连接。(我们可以在这里使用 xampp 来创建服务器)。

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

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

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

于 2013-06-13T10:45:27.557 回答
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;
}

如果您在专用线程上运行 forward 方法,您可以跳过bytesToRead外部检查while并使用while (1)

于 2013-06-13T11:54:59.883 回答