Http C ++客户端无法通过Internet连接到C ++服务器

时间:2019-07-11 09:22:31

标签: c++ http

我正在尝试在本地应用程序和远程应用程序之间建立连接。我使用HTTP协议,在局域网中进行测试时,我的客户端服务器代码已成功将文件相互发送;但是,当我将服务器代码推送到Cloud上运行时,客户端无法连接到服务器。

下面是我的C ++客户服务器代码。在代码中,我尝试将图像从客户端发送到服务器。 client.c

#define EXAMPLE_RX_BUFFER_BYTES (921600)
#define IMAGE_SIZE 921600 

static int callback_example( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
{
    switch( reason )
    {
        case LWS_CALLBACK_CLIENT_ESTABLISHED:
            lws_callback_on_writable( wsi );
            break;

        case LWS_CALLBACK_CLIENT_RECEIVE:
            break;

        case LWS_CALLBACK_CLIENT_WRITEABLE:
        {
            FILE * check_file;
            check_file = fopen("test_buff.jpg", "r");

            unsigned char buf[LWS_SEND_BUFFER_PRE_PADDING + EXAMPLE_RX_BUFFER_BYTES + LWS_SEND_BUFFER_POST_PADDING];
            fread(&buf[LWS_SEND_BUFFER_PRE_PADDING], 1, IMAGE_SIZE, check_file);    
            printf("%ld\n", sizeof(buf));
            printf("hello\n");
            printf("%d\n", LWS_SEND_BUFFER_POST_PADDING);
            unsigned char *p = &buf[LWS_SEND_BUFFER_PRE_PADDING]; 
            size_t n = IMAGE_SIZE;
            lws_write( wsi, p, n, LWS_WRITE_TEXT );  //send 
            break;
        }

        case LWS_CALLBACK_CLOSED:   
        case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
            web_socket = NULL;
            break;

        default:
            break;
    }
    return 0;
}

enum protocols
{
    PROTOCOL_EXAMPLE = 0,
    PROTOCOL_COUNT
};

static struct lws_protocols protocols[] =
{
    {
        "example-protocol",
        callback_example,
        0,
        EXAMPLE_RX_BUFFER_BYTES,
    },
    { NULL, NULL, 0, 0 } /* terminator */
};

int main( int argc, char *argv[] )
{
    struct lws_context_creation_info info;
    memset( &info, 0, sizeof(info) );

    info.port = CONTEXT_PORT_NO_LISTEN;
    info.protocols = protocols;
    info.gid = -1;
    info.uid = -1;

    struct lws_context *context = lws_create_context( &info );

    time_t old = 0;
    while( 1 )
    {
        struct timeval tv;
        gettimeofday( &tv, NULL );
        if( !web_socket && tv.tv_sec != old )
        {
            struct lws_client_connect_info ccinfo = {0};
            ccinfo.context = context;
            ccinfo.address = "https://http-server.wise-paas.io";
            ccinfo.port = 8080;
            ccinfo.path = "/";
            ccinfo.host = lws_canonical_hostname( context );
            ccinfo.origin = "origin";
            ccinfo.protocol = protocols[PROTOCOL_EXAMPLE].name;
            web_socket = lws_client_connect_via_info(&ccinfo);
        }

        if( tv.tv_sec != old )
        {
            lws_callback_on_writable( web_socket );
            old = tv.tv_sec;
        }

        lws_service( context, 250 );
        sleep(1);
    }

    lws_context_destroy( context );
    return 0;
}

server.c

static int callback_http( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
{
    switch( reason )
    {
        case LWS_CALLBACK_HTTP:
            lws_serve_http_file( wsi, "example.html", "text/html", NULL, 0 );
            break;
        default:
            break;
    }

    return 0;
}
int count = 0;
int length = 0;
struct payload
{
    unsigned char data[LWS_SEND_BUFFER_PRE_PADDING + IMAGE_SIZE + LWS_SEND_BUFFER_POST_PADDING];
    size_t len;
} received_payload;

static int callback_example( struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len )
{
    switch( reason )
    {
        case LWS_CALLBACK_RECEIVE:

            //while(length < IMAGE_SIZE){

            memcpy( &received_payload.data[LWS_SEND_BUFFER_PRE_PADDING + length], in, len );

            // for(int i =16; i < (LWS_SEND_BUFFER_PRE_PADDING + len); i++){
            //  printf("%c\t", received_payload.data[i]);
            // }
            length+=len;
            received_payload.len = length;
            // printf("\n\nlength: %d \n", length);
            //}
            lws_callback_on_writable_all_protocol( lws_get_context( wsi ), lws_get_protocol( wsi ) );
            //unsigned char *p = &received_payload.data[LWS_SEND_BUFFER_PRE_PADDING];
            // count++;
            if(length >= 921600){
                length = 0;
                }

            printf("hello for saving\n");
            printf("%d\n%d\n", len, sizeof(received_payload.data));

            FILE *receive_test;

            receive_test = fopen("write", "w");
            fwrite(&received_payload.data[LWS_SEND_BUFFER_PRE_PADDING], 1, IMAGE_SIZE, receive_test);

            fclose(receive_test);

            break;

        case LWS_CALLBACK_SERVER_WRITEABLE:
            lws_write( wsi, &received_payload.data[LWS_SEND_BUFFER_PRE_PADDING], received_payload.len, LWS_WRITE_TEXT );
            break;

        default:
            break;
    }

    return 0;
}

enum protocols
{
    PROTOCOL_HTTP = 0,
    PROTOCOL_EXAMPLE,
    PROTOCOL_COUNT
};

static struct lws_protocols protocols[] =
{
    /* The first protocol must always be the HTTP handler */
    {
        "http-only",   /* name */
        callback_http, /* callback */
        0,             /* No per session data. */
        0,             /* max frame size / rx buffer */
    },
    {
        "example-protocol",
        callback_example,
        0,
        EXAMPLE_RX_BUFFER_BYTES,
    },
    { NULL, NULL, 0, 0 } /* terminator */
};

int main( int argc, char *argv[] )
{
    struct lws_context_creation_info info;
    memset( &info, 0, sizeof(info) );

    info.port = 8080;
    info.protocols = protocols;
    info.gid = -1;
    info.uid = -1;

    struct lws_context *context = lws_create_context( &info );

    while( 1 )
    {
        lws_service( context, /* timeout_ms = */ 1000000 );
    }

    lws_context_destroy( context );

    return 0;
}

0 个答案:

没有答案