esemi00
Dependencies: mbed mbed-rtos EthernetInterface FatFileSystemCpp
mainETH_TCP_SERVERren.cpp@0:86b964b67dae, 2021-01-20 (annotated)
- Committer:
- esemi00
- Date:
- Wed Jan 20 05:23:38 2021 +0000
- Revision:
- 0:86b964b67dae
esemi00
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
esemi00 | 0:86b964b67dae | 1 | //eth_tcp_server.cpp |
esemi00 | 0:86b964b67dae | 2 | #include "mbed.h" |
esemi00 | 0:86b964b67dae | 3 | #include "EthernetInterface.h" |
esemi00 | 0:86b964b67dae | 4 | #include " " // ① |
esemi00 | 0:86b964b67dae | 5 | |
esemi00 | 0:86b964b67dae | 6 | #define HTTP_TCP_PORT 80 |
esemi00 | 0:86b964b67dae | 7 | #define FSNAME " " //② |
esemi00 | 0:86b964b67dae | 8 | |
esemi00 | 0:86b964b67dae | 9 | Serial pc(USBTX,USBRX); |
esemi00 | 0:86b964b67dae | 10 | EthernetInterface eth; |
esemi00 | 0:86b964b67dae | 11 | msc(FSNAME); //③ |
esemi00 | 0:86b964b67dae | 12 | |
esemi00 | 0:86b964b67dae | 13 | void http(); |
esemi00 | 0:86b964b67dae | 14 | |
esemi00 | 0:86b964b67dae | 15 | int main() |
esemi00 | 0:86b964b67dae | 16 | { |
esemi00 | 0:86b964b67dae | 17 | eth.init(); //Use DHCP |
esemi00 | 0:86b964b67dae | 18 | eth.connect(); |
esemi00 | 0:86b964b67dae | 19 | pc.printf("\nServer IP Address is %s\n", eth.getIPAddress()); |
esemi00 | 0:86b964b67dae | 20 | http(); |
esemi00 | 0:86b964b67dae | 21 | eth.disconnect(); |
esemi00 | 0:86b964b67dae | 22 | } |
esemi00 | 0:86b964b67dae | 23 | |
esemi00 | 0:86b964b67dae | 24 | void http() |
esemi00 | 0:86b964b67dae | 25 | { |
esemi00 | 0:86b964b67dae | 26 | char buf[1024]; |
esemi00 | 0:86b964b67dae | 27 | char buf_s[2048]; |
esemi00 | 0:86b964b67dae | 28 | char meth_name[16]; |
esemi00 | 0:86b964b67dae | 29 | char uri_addr[256]; |
esemi00 | 0:86b964b67dae | 30 | char http_ver[64]; |
esemi00 | 0:86b964b67dae | 31 | int n; |
esemi00 | 0:86b964b67dae | 32 | |
esemi00 | 0:86b964b67dae | 33 | char buf_f[ ];//④ |
esemi00 | 0:86b964b67dae | 34 | char uri_file[ ];//⑤ |
esemi00 | 0:86b964b67dae | 35 | |
esemi00 | 0:86b964b67dae | 36 | //ステップ1 ソケットの生成 |
esemi00 | 0:86b964b67dae | 37 | TCPSocketServer server; |
esemi00 | 0:86b964b67dae | 38 | TCPSocketConnection client; |
esemi00 | 0:86b964b67dae | 39 | |
esemi00 | 0:86b964b67dae | 40 | //ステップ2 ポートの登録 |
esemi00 | 0:86b964b67dae | 41 | server.bind(HTTP_TCP_PORT); |
esemi00 | 0:86b964b67dae | 42 | |
esemi00 | 0:86b964b67dae | 43 | //ステップ3 ソケットの待機準備 |
esemi00 | 0:86b964b67dae | 44 | server.listen(5); |
esemi00 | 0:86b964b67dae | 45 | |
esemi00 | 0:86b964b67dae | 46 | // ステップB HTTPレスポンス作成 |
esemi00 | 0:86b964b67dae | 47 | memset(buf_s, 0, sizeof(buf_s)); //HTTPレスポンス用バッファメモリを初期化 |
esemi00 | 0:86b964b67dae | 48 | snprintf(buf_s, sizeof(buf_s), //200のHTTPレスポンスの作成 |
esemi00 | 0:86b964b67dae | 49 | "HTTP/1.0 200 Document follows\r\n" //ステータス行 |
esemi00 | 0:86b964b67dae | 50 | "Content-Type: text/html\r\n" |
esemi00 | 0:86b964b67dae | 51 | "\r\n" //空白行(これ以降、送信したデータはボディ) |
esemi00 | 0:86b964b67dae | 52 | "HELLO\r\n"); |
esemi00 | 0:86b964b67dae | 53 | |
esemi00 | 0:86b964b67dae | 54 | while(true){ |
esemi00 | 0:86b964b67dae | 55 | printf("\n\nWait for new connection...\n"); |
esemi00 | 0:86b964b67dae | 56 | |
esemi00 | 0:86b964b67dae | 57 | //ステップ4 ソケットの接続受付 |
esemi00 | 0:86b964b67dae | 58 | server.accept(client); |
esemi00 | 0:86b964b67dae | 59 | client.set_blocking(false, 1500); |
esemi00 | 0:86b964b67dae | 60 | printf("Connection from: %s\n", client.get_address()); |
esemi00 | 0:86b964b67dae | 61 | |
esemi00 | 0:86b964b67dae | 62 | while (true) { |
esemi00 | 0:86b964b67dae | 63 | // ステップ5 データの受信 |
esemi00 | 0:86b964b67dae | 64 | n = client.receive(buf, sizeof(buf)); |
esemi00 | 0:86b964b67dae | 65 | pc.printf("%d byte\r\n", n); |
esemi00 | 0:86b964b67dae | 66 | if (n <= 0){ |
esemi00 | 0:86b964b67dae | 67 | // データがない場合 |
esemi00 | 0:86b964b67dae | 68 | break; |
esemi00 | 0:86b964b67dae | 69 | } else { |
esemi00 | 0:86b964b67dae | 70 | // データがある場合 |
esemi00 | 0:86b964b67dae | 71 | buf[n] = '\0'; |
esemi00 | 0:86b964b67dae | 72 | printf("Received message from Client :%s",buf); |
esemi00 | 0:86b964b67dae | 73 | |
esemi00 | 0:86b964b67dae | 74 | // ステップA HTTPリクエストのリクエスト行の分解 |
esemi00 | 0:86b964b67dae | 75 | sscanf(buf, "%s %s %s", meth_name, uri_addr, http_ver); |
esemi00 | 0:86b964b67dae | 76 | printf("meth_name:'%s'\n",meth_name);//メソッド(GETのみ) |
esemi00 | 0:86b964b67dae | 77 | printf("uri_addr:'%s'\n",uri_addr);//リクエスト対象(ファイル) |
esemi00 | 0:86b964b67dae | 78 | printf("http_ver:'%s'\n",http_ver);//HTTPのバージョン |
esemi00 | 0:86b964b67dae | 79 | |
esemi00 | 0:86b964b67dae | 80 | //ステップC HTTPレスポンスの送信 |
esemi00 | 0:86b964b67dae | 81 | if (strcmp(meth_name, "GET") != 0) { |
esemi00 | 0:86b964b67dae | 82 | //GET以外のとき |
esemi00 | 0:86b964b67dae | 83 | pc.printf("HTTP/1.0 501 Not Implemented\r\n"); |
esemi00 | 0:86b964b67dae | 84 | client.send("HTTP/1.0 501 Not Implemented", 28); |
esemi00 | 0:86b964b67dae | 85 | } else { |
esemi00 | 0:86b964b67dae | 86 | //GETのとき |
esemi00 | 0:86b964b67dae | 87 | memset(uri_file, 0, 1); |
esemi00 | 0:86b964b67dae | 88 | strcat(uri_file, " "); //⑥ |
esemi00 | 0:86b964b67dae | 89 | strcat(uri_file, ); //⑦ |
esemi00 | 0:86b964b67dae | 90 | strcat(uri_file, ); //⑧ |
esemi00 | 0:86b964b67dae | 91 | |
esemi00 | 0:86b964b67dae | 92 | FILE *read_fp = fopen( ); //⑨ |
esemi00 | 0:86b964b67dae | 93 | |
esemi00 | 0:86b964b67dae | 94 | if(read_fp == NULL) { |
esemi00 | 0:86b964b67dae | 95 | pc.printf("HTTP/1.0 404 Not Found %s \r\n", uri_file); |
esemi00 | 0:86b964b67dae | 96 | client.send("HTTP/1.0 404 Not Found", 22); |
esemi00 | 0:86b964b67dae | 97 | break; |
esemi00 | 0:86b964b67dae | 98 | } else { |
esemi00 | 0:86b964b67dae | 99 | pc.printf("%s", buf_s); |
esemi00 | 0:86b964b67dae | 100 | client.send(buf_s, (int)strlen(buf_s)); |
esemi00 | 0:86b964b67dae | 101 | while( NULL != ) {//⑩ |
esemi00 | 0:86b964b67dae | 102 | pc.printf("%s", buf_f); |
esemi00 | 0:86b964b67dae | 103 | client.send( ); //⑪ |
esemi00 | 0:86b964b67dae | 104 | } |
esemi00 | 0:86b964b67dae | 105 | } |
esemi00 | 0:86b964b67dae | 106 | fclose(read_fp); |
esemi00 | 0:86b964b67dae | 107 | } |
esemi00 | 0:86b964b67dae | 108 | } |
esemi00 | 0:86b964b67dae | 109 | } |
esemi00 | 0:86b964b67dae | 110 | |
esemi00 | 0:86b964b67dae | 111 | // ステップ7 ソケット間の通信接続を切断 |
esemi00 | 0:86b964b67dae | 112 | client.close(); |
esemi00 | 0:86b964b67dae | 113 | pc.printf("client close\r\n"); |
esemi00 | 0:86b964b67dae | 114 | } |
esemi00 | 0:86b964b67dae | 115 | } |