esemi00

Dependencies:   mbed mbed-rtos EthernetInterface FatFileSystemCpp

Committer:
esemi00
Date:
Wed Jan 20 05:23:38 2021 +0000
Revision:
0:86b964b67dae
esemi00

Who changed what in which revision?

UserRevisionLine numberNew 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 }