我已阅读SSL TUNNELING INTERNET-DRAFT of December 1995并设置了一个HTTP透明代理,可以很好地处理未加密的流量。
阅读了上述内容,并将我的大脑搜索出来后,通过代理创建隧道以实现安全流量的可接受方法似乎是:
连接到请求的主机,然后让代理向客户端发送“HTTP 200 ...”确认消息,然后从那时起简单地传递客户端和服务器之间的所有其他数据流量。
然而,当我尝试此操作时,客户端(Chrome浏览器)会响应“HTTP 200 ...”消息,其中包含三个翼形字符,我将其转发到远程主机。此时没有回复,连接失败。
以下是连接到主机后我正在使用的代码:
if((*request=='C')&&(*(request+1)=='O')&&(*(request+2)=='N')&&(*(request+3)=='N'))
{
int recvLen;
send(output,htok,strlen(htok),0); //htok looks like "HTTP/1.0 200 Connection Established\nProxy-Agent: this_proxy\r\n\r\n"
std::memset(buff,0,bSize);
int total;
int bytes;
int n;
char cdata[MAXDATA];
while ((recvLen = recv(output, buff, bSize-1,0)) > 0) //recving from client - here we get wingdings
{
memset(cdata,0, MAXDATA);
strcat(cdata, buff);
while(recvLen>=bSize-1)//just in case buff is too small
{
std::memset(buff,0,bSize);
recvLen=recv(output,buff,bSize-1,0);
strcat(cdata, buff);
}
total = 0;
bytes = strlen(cdata);
cout << cdata << endl;//how I see the wingdings
while (total < strlen(cdata))
{
n = send(requestSock, cdata + total, bytes,0);//forwarding to remote host
if(n == SOCKET_ERROR)
{
cout << "secure sending error" << endl;
break;
}
total += n;
bytes -= n;
}
std::memset(buff,0,bSize);
recvLen=recv(requestSock, buff, bSize,0);//get reply from remote host
if (recvLen > 0)
{
do
{
cout<<"Thread "<<threadid<<" [Connection:Secure]: "<<recvLen<<endl;
send(output, buff, recvLen,0);//forward all to client
recvLen= recv(requestSock, buff, bSize,0);
if(0==recvLen || SOCKET_ERROR==recvLen)
{
cout<<"finished secure receiving or socket error"<<endl;
break;
}
}while(true);
}
}//end while, loop checks again for client data
有人能发现我的错误吗?
答案 0 :(得分:3)
您的代码比必要的复杂得多。只需读入一个char数组,保存返回的长度,并在循环中从同一个数组中写入多个字节,直到recv()返回零。 4行代码,包括两个用于括号。不要尝试组装整个传入的消息,只是传递进来的任何内容。否则,您只是添加延迟和编程错误。完全摆脱所有strXXX()调用。
答案 1 :(得分:2)
我认为您不应该假设流量不包含ASCII NUL
字符:
strcat(cdata, buff);
}
total = 0;
bytes = strlen(cdata);
如果流中有ASCII NUL
,则这些将失败。