zoukankan      html  css  js  c++  java
  • 20171111 Sa Oct Is it online

    2017-11-11 Sa Oct Is it online

    9:07 AM

    After breakfast I tried connecting to the course selection system (CSS) however got only a 502 Bad Gateway. Since the CSS is usually put online before when it was said, so it came up to my mind: Why not write a program to detect whether it is online automatically? I have become willing to learn the Network Programming since a long time before.

    I meant 'Network Programming', so I'm not just using libraries like urlllib and won't use Python.

    And I went to this page: Simple C example of doing an HTTP POST and consuming the response.
    asked 3 years, 8 months ago, http://stackoverflow.com/questions/22077802/simple-c-example-of-doing-an-http-post-and-consuming-the-response

    Here is the answer of Jerry Jeremiah, answered Mar 3 '14 at 0:54. (https://stackoverflow.com/users/2193968/jerry-jeremiah)

    A message has a header part and a message body separated by a blank line. The blank line is ALWAYS needed even if there is no message body. The header starts with a command and has additional lines of key value pairs separated by a colon and a space. If there is a message body, it can be anything you want it to be.
    Lines in the header and the blank line at the end of the header must end with a carraige return and linefeed pair (see HTTP header line break style) so that's why those lines have \r\n at the end.

    https://stackoverflow.com/questions/5757290/http-header-line-break-style
    

    A URL has the form of http://host:port/path?query_string
    There are two main ways of submitting a request to a website:
    GET: The query string is optional but, if specified, must be reasonably short. Because of this the header could just be the GET command and nothing else. A sample message could be:

    GET /path?query_string HTTP/1.0\r\n
    \r\n
    

    POST: What would normally be in the query string is in the body of the message instead. Because of this the header needs to include the Content-Type: and Content-Length: attributes as well as the POST command. A sample message could be:

    POST /path HTTP/1.0\r\n
    Content-Type: text/plain\r\n
    Content-Length: 12\r\n
    \r\n
    query_string
    

    So, to answer your question: if the URL you are interested in POSTing to is http://api.somesite.com/apikey=ARG1&command=ARG2 then there is no body or query string and, consequently, no reason to POST because there is nothing to put in the body of the message and so nothing to put in the Content-Type: and Content-Length:
    I guess you could POST if you really wanted to. In that case your message would look like:

    POST /apikey=ARG1&command=ARG2 HTTP/1.0\r\n
    \r\n
    

    So to send the message the C program needs to:

    • create a socket
    • lookup the IP address
    • open the socket
    • send the request
    • wait for the response
    • close the socket

    The send and receive calls won't necessarily send/receive ALL the data you give them - they will return the number of bytes actually sent/received. It is up to you to call them in a loop and send/receive the remainder of the message.
    What I did not do in this sample is any sort of real error checking - when something fails I just exit the program. Let me know if it works for you:

    #include <stdio.h> /* printf, sprintf */
    #include <stdlib.h> /* exit */
    #include <unistd.h> /* read, write, close */
    #include <string.h> /* memcpy, memset */
    #include <sys/socket.h> /* socket, connect */
    #include <netinet/in.h> /* struct sockaddr_in, struct sockaddr */
    #include <netdb.h> /* struct hostent, gethostbyname */
    
    void error(const char *msg) { perror(msg); exit(0); }
    
    int main(int argc,char *argv[])
    {
        /* first what are we going to send and where are we going to send it? */
        int portno =        80;
        char *host =        "api.somesite.com";
        char *message_fmt = "POST /apikey=%s&command=%s HTTP/1.0\r\n\r\n";
    
        struct hostent *server;
        struct sockaddr_in serv_addr;
        int sockfd, bytes, sent, received, total;
        char message[1024],response[4096];
    
        if (argc < 3) { puts("Parameters: <apikey> <command>"); exit(0); }
    
        /* fill in the parameters */
        sprintf(message,message_fmt,argv[1],argv[2]);
        printf("Request:\n%s\n",message);
    
        /* create the socket */
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) error("ERROR opening socket");
    
        /* lookup the ip address */
        server = gethostbyname(host);
        if (server == NULL) error("ERROR, no such host");
    
        /* fill in the structure */
        memset(&serv_addr,0,sizeof(serv_addr));
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(portno);
        memcpy(&serv_addr.sin_addr.s_addr,server->h_addr,server->h_length);
    
        /* connect the socket */
        if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0)
            error("ERROR connecting");
    
        /* send the request */
        total = strlen(message);
        sent = 0;
        do {
            bytes = write(sockfd,message+sent,total-sent);
            if (bytes < 0)
                error("ERROR writing message to socket");
            if (bytes == 0)
                break;
            sent+=bytes;
        } while (sent < total);
    
        /* receive the response */
        memset(response,0,sizeof(response));
        total = sizeof(response)-1;
        received = 0;
        do {
            bytes = read(sockfd,response+received,total-received);
            if (bytes < 0)
                error("ERROR reading response from socket");
            if (bytes == 0)
                break;
            received+=bytes;
        } while (received < total);
    
        if (received == total)
            error("ERROR storing complete response from socket");
    
        /* close the socket */
        close(sockfd);
    
        /* process response */
        printf("Response:\n%s\n",response);
    
        return 0;
    }
    

    Like the other answer pointed out, 4096 bytes is not a very big response. I picked that number at random assuming that the response to your request would be short. If it can be big you have two choices:

    • read the Content-Length: header from the response and then dynamically allocate enough memory to hold the whole response.
    • write the response to a file as the pieces arrive

    There's still some above, but that's enough for me. How to detect 502 Bad Gateway?

    9:40 AM

    I'll firstly test it with my blog.

    C:\Users\01\Desktop>cc foo.c
    C:\Users\01\AppData\Local\Temp/cc4qSwMr.o:foo.c:(.text+0xac): undefined referenc
    e to `socket'
    C:\Users\01\AppData\Local\Temp/cc4qSwMr.o:foo.c:(.text+0xcc): undefined referenc
    e to `gethostbyname'
    C:\Users\01\AppData\Local\Temp/cc4qSwMr.o:foo.c:(.text+0x110): undefined referen
    ce to `htons'
    C:\Users\01\AppData\Local\Temp/cc4qSwMr.o:foo.c:(.text+0x152): undefined referen
    ce to `connect'
    collect2: ld returned 1 exit status
    

    libws2_32.a, libwsock32.a

    C:\Users\01\Desktop>cc foo.c -l libws2_32.a -l libwsock32.a
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
    d -llibws2_32.a
    collect2: ld returned 1 exit status
    
    C:\Users\01\Desktop>cc foo.c -l C:\MinGW\lib\libws2_32.a -l C:\MinGW\lib\libwsoc
    k32.a
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
    d -lC:\MinGW\lib\libws2_32.a
    collect2: ld returned 1 exit status
    
    C:\Users\01\Desktop>cc foo.c -l "C:\MinGW\lib\libws2_32.a" -l "C:\MinGW\lib\libw
    sock32.a"
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
    d -lC:\MinGW\lib\libws2_32.a
    collect2: ld returned 1 exit status
    
    C:\Users\01\Desktop>cc foo.c "C:\MinGW\lib\libws2_32.a" "C:\MinGW\lib\libwsock32
    .a"
    C:\Users\01\AppData\Local\Temp/ccENCuED.o:foo.c:(.text+0xac): undefined referenc
    e to `socket'
    C:\Users\01\AppData\Local\Temp/ccENCuED.o:foo.c:(.text+0xcc): undefined referenc
    e to `gethostbyname'
    C:\Users\01\AppData\Local\Temp/ccENCuED.o:foo.c:(.text+0x110): undefined referen
    ce to `htons'
    C:\Users\01\AppData\Local\Temp/ccENCuED.o:foo.c:(.text+0x152): undefined referen
    ce to `connect'
    collect2: ld returned 1 exit status
    
    C:\Users\01\Desktop>cc foo.c -lsocket
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot fin
    d -lsocket
    collect2: ld returned 1 exit status
    

    Starting virtualbox.. Fedora-Scientific_KDE-Live-x86_64-25-1.3.iso

    didn't work. BT5R3-GNOME-32.iso

    It reminds me that my first contact to Linux was with Backtrack. It's about my fourth or fifth grade in the primary school, when my father brought back home a WiFiCity suite from Hong Kong, which is used for getting others' WiFi password and surf the Net with that. We did succeed but the speed is too slow. I can stil remember that when connected my father tested the network with the Luogang District Government website but I insisted on the dnf.qq.com. .

    2pcs/lot LAN card 10G wifi decoder,USB 802.11b/g adaptor,wifly city,wireless wifi receiver
    US $33.67 - 38.96
    Product Name: 2pcs/lot LAN card 10G wifi decoder,USB 802.11b/g adaptor,wifly city,wireless wifi receiver
    Item Code: 129611185
    Category: Other Networking & Communications
    Short Description:
    free or wireless internet for laptop and desktop ; Best seller & Hot model; BT3,BT4 suitable ; Get wifi > freely.
    Quantity: 1 Lot (2 Piece / Lot)
    Package Size: 33.0 * 33.0 * 33.0 ( cm )
    Gross Weight/Package: 0.5 ( kg )





    10:07 AM

    Now use FTP to transfer the source code to the virtualbox.


  • 相关阅读:
    CF1438D Powerful Ksenia(构造题)
    AT5759 ThREE(构造)
    浏览器中上面三个字,下面两个字 两端对齐(转)
    luoguP3372 【模板】线段树 1
    大数据-linux实操篇-组管理和权限管理
    大数据-linux实操篇-解压和压缩类指令
    大数据-linux实操篇-搜索查找类指令
    大数据-linux实操篇-文件目录类指令
    大数据-linux实操篇-帮助指令
    大数据-linux实操篇-实用指令(七个级别、忘记root密码)
  • 原文地址:https://www.cnblogs.com/yanhuihang/p/7818127.html
Copyright © 2011-2022 走看看