我有一台服务器与另一台服务器联系,以检索客户请求的文件。
请求流程为:
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 :(得分: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)