尝试构建代理服务器 来自客户的recv - >发送到服务器 - >来自服务器的recv - >发送给客户。
代理从客户端接收正确的数据 但之后我从服务器上收集了0个字节。
这是我应该从客户端收到的数据包并发送到服务器
0A 00 2C 01 23 00 0C 00 B3 01
这是我的代码;
//intercept commu by server <-> client
memset(buffer, 0, buffer_len);
//recv from client
if((bytecount = recv(*csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Err: receiving data %d\n", errno);
return 0;
}
//display what we got from the client
printf("Received bytes %d\n", bytecount);
for ( int i = 0; i < bytecount; i++ ) {
printf( "%02x ", static_cast<unsigned char>( buffer[i] ) );
}
printf("\n");
//send to server what we got from the client
if((gbytecount=send(gsock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error sending data %d\n", errno);
goto FINISH;
}
//recv from server
if((gbytecount = recv(gsock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %d\n", errno);
return 0;
}
printf("Received bytes %d\n", gbytecount);
for ( int i = 0; i < gbytecount; i++ ) {
printf( "%02x ", static_cast<unsigned char>( buffer[i] ) );
}
printf("\n");
//send back to client what we got from the server
if((bytecount = send(*csock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Err: sending data %d\n", errno);
return 0;
}
如何在客户端recv后检查代理发送给服务器的内容?
我的逻辑有问题吗?
更新
我想我发现了问题,因为buffer_len。
现在我有recv()字节93.但是服务器再次发送另一个数据包 我该如何处理我的代码?
目前我的代码是:
recv from client -> send to server -> recv from server -> send to client.
如何使这个代码如果客户端/服务器发送一些东西,它将
将它转发给另一个人?
更新
得解决它。感谢。
答案 0 :(得分:2)
我不知道你的服务器和客户端,但是服务器实际上可能是close
导致recv
导致0的套接字,而关闭的原因可能是你收到{ {1}}来自客户端的数据,但发送bytecount
数据到服务器,可能会在有效数据发送到服务器后导致一些无效数据!
答案 1 :(得分:2)
您正在使用阻止调用,假设客户端 - >服务器调用的直接1-1比率(反之亦然),但在现实世界的应用程序中几乎肯定不会出现这种情况。实际上,应用程序将在多次调用中接收部分TCP流,以从客户端和服务器接收。您可以通过两种不同的方式处理此问题。使用select()
查看哪些套接字需要从中读取数据,或者使用异步库来方便您从客户端/服务器套接字读取/写入。
由于这似乎出现了很多,请参阅我对这个问题的回答:How to make a proxy server in C++ using Boost
请参阅select() API
或者,here's an example for writing one in boost。如果你谷歌“boost :: asio代理服务器”,还有很多其他的例子。
答案 2 :(得分:0)
BigBoss的答案是正确的: - 你应该将字节数字节发送到gsock而不是发送buffer_len字节。更好的是,如果可能的话,你应该从头部读取数据包的大小,并在可能的情况下读取多个字节