使用TCP套接字发送的字节到字节

时间:2013-06-13 10:31:38

标签: c sockets

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

请求流程为:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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)