C++ Linux 代理服务器通信
C++ linux proxy server communications
正在尝试构建代理服务器。
来自客户端的 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 %dn", errno);
return 0;
}
//display what we got from the client
printf("Received bytes %dn", 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 %dn", errno);
goto FINISH;
}
//recv from server
if((gbytecount = recv(gsock, buffer, buffer_len, 0))== -1){
fprintf(stderr, "Error receiving data %dn", errno);
return 0;
}
printf("Received bytes %dn", 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 %dn", errno);
return 0;
}
如何检查代理在从客户端接收后发送到服务器的内容?
我的逻辑有问题吗?
更新
我想我发现了问题,这是因为buffer_len。
现在我有 recv() 字节 93。但服务器再次发送另一个数据包。
我该如何处理我的代码?
目前我的代码是:
recv from client -> send to server -> recv from server -> send to client.
我怎样才能使这段代码像如果客户端/服务器发送一些东西,它会
转发给对方?
更新
必须解决它。谢谢。
我不知道你的服务器和客户端,但可能是服务器实际上close
由于recv
导致0的套接字,关闭的原因可能是你从客户端接收bytecount
数据,但buffer_len
数据发送到服务器,这可能会导致有效数据发送到服务器后的一些无效数据!
您正在使用阻止调用,假设客户端>服务器调用的直接比率为 1-1(反之亦然),但在实际应用程序中几乎可以肯定情况并非如此。 实际上,应用程序将在大量调用中接收部分TCP流,以从客户端和服务器接收。 您可以通过两种不同的方式处理此问题。 使用 select()
查看哪些套接字需要从中读取数据,或使用异步库来方便您从客户端/服务器套接字读取/写入。
由于这似乎出现了很多,请参阅我对这个问题的回答:如何使用 Boost 在C++制作代理服务器
请参阅 select() API
或者,这里有一个在 boost 中编写一个的示例。 如果你谷歌"boost::asio代理服务器",还有许多其他例子。
BigBoss 的答案是正确的:你应该将字节计数字节发送到 gsock,而不是发送buffer_len字节。更好的是,如果可能的话,你应该从标头中读取数据包的大小,并在可能的情况下读取尽可能多的字节
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 提升::Asio 异步聊天客户端停止与服务器通信
- UDP客户端/服务器程序在不同的IP和端口上通信超过2个插座
- 如何让客户端通过modbus-tcp协议与多个服务器通信?
- librdkafka c++ 库是否有模拟服务器或代理
- 如何将数据序列化为C++ zmq 客户端和 Python zmq 服务器之间的通信
- 与语言服务器通信(Languager服务器协议)
- 使用UNIX套接字C++客户端与Node.js服务器通信的简单示例
- 嗅探 QWebsocket 服务器 - 客户端通信
- 证书验证在客户端服务器通信中使用boost :: asio和openssl失败
- C++ Linux 代理服务器通信
- C 中客户端代理服务器系统的任何库
- 如何读取 HTTP 请求(HTTP 代理服务器)
- QSslSocket代理服务器(https)和证书.握手错误
- 如何告诉 WinINet 使用 IE 的代理服务器凭据
- Django作为mysql代理服务器
- 通过代理服务器增强asio套接字连接
- C++中的HTTP代理服务器
- 代理服务器正在丢弃数据包
- 如何向 socks5 代理服务器添加身份验证