C ++ linux代理服务器通信

时间:2012-11-30 21:07:25

标签: c++ sockets

尝试构建代理服务器 来自客户的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.

如何使这个代码如果客户端/服务器发送一些东西,它将

将它转发给另一个人?


更新

得解决它。感谢。

3 个答案:

答案 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字节。更好的是,如果可能的话,你应该从头部读取数据包的大小,并在可能的情况下读取多个字节