C++ Linux 代理服务器通信

C++ linux proxy server communications

本文关键字:通信 代理服务器 Linux C++      更新时间:2023-10-16

正在尝试构建代理服务器。
来自客户端的 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字节。更好的是,如果可能的话,你应该从标头中读取数据包的大小,并在可能的情况下读取尽可能多的字节