[H8-ML(1755)] H8/3068F LANのプログラム
From: Nishimoto Hiroshi <nsmt@xxxxxxxxxxxxxxxx>
Date: 2002年04月18日(木)15時46分59秒
はじめまして、西本と申します。

H8/3068F LAN上で動くHTTPのテストプログラムを作っています。

付属しているhttp.cでは受信割りこみに対して1回データを送信していますが
バッファサイズを越えるデータを送信するためにはどうすればいいでしょう
か?

システムコール仕様書ではtcp_writeをtcpsocketで登録されたハンドラ外で使
用する場合はset_tcpaddrで送信先を指定する事となっています。

プログラムはそのように組みました。H8/3068Fとのパケットのやり取りは
etherealというパケットキャプチャで見て、データは送信されているのですが
ブラウザでは2回目以降のデータを無視している様です。

気になる点といえば、1回目と2回目のパケットでシーケンス番号が同じとい
う所まで判ったのですが、どう対処していいか判らない状態です。

H8/OS詳しい方にフォローしていただきたく。恥ずかしいんですが、ソースも
付けてみますので、よろしくお願いします。

プログラムは、ブラウザにメニューが表示され、リンクに合わせた内容が表示
するというものです。

尚
ハード H8/3068F + 16M-DRAM + 24LC256
ソフト H8/OS-V2
開発  LINUXのGCC ディストリビューションはPlamo-2.1

ram3068.xは以下の様に修正して400000Hからロード、実行させています。
MEMORY
{
     syscall(r) : o = 0x000100, l = 0x0200
     ram(rwx)   : o = 0x400000, l = 0x20000
}



------ 以下 ソース

#include <h8/reg3067.h>
#include <h8/syscall.h>
#include <string.h>
#include <stdlib.h>


char buffer[256],cname[30] ;
int socket,rflag ;

char http_buf[500] ;
int http_index;

struct sockaddr_in *address;

void ht_write(char * buf) {
    int i ,sts ;

    for ( i = 0 ; buf[i] != '\0' ; i ++  ) {
        http_buf[http_index++] = buf[i] ;
        if ( http_index >= sizeof http_buf ) {
            sts = tcp_write(socket, http_buf, sizeof http_buf);
            printf("tcp_write-2(%d)=%d\n",socket,sts ) ;
            http_index = 0 ;
        }
    }
}

void ht_flash() {
    int sts ;
    if ( http_index == 0 ) return ;
    sts = tcp_write(socket, http_buf, http_index);
    printf("tcp_write-1(%d)=%d\n",socket,sts ) ;
    http_index = 0 ;
}

void http_header() {
    ht_write("HTTP/1.1 200 OK\n");
    ht_write("Server: H8/OS H8-3067F\n");
    ht_write("Content-length:10");
    ht_write("\n\n");
} ;

void home_disp() {
    const static char *main_html ="<html>\n\
    <head>\n<title>HOME</title>\n </head>\n <body>\n\
    <h2>H8-LAN board MAIN-MENU</h2>\n <hr>\n\
    <blockquote>\n\
      <p>1.<a href=\"home.html\">HOME</a></p>\n\
      <p>2.<a href=\"calc.html\">CALC</a></p>\n\
    </blockquote>\n <hr></body></html>\n" ;

    http_header() ;
    ht_write((char *)main_html) ;
    ht_flash();
}


void BS_disp() {
    const static char *main_html ="<html>\n<head>\n\
    <title>BS</title>\n </head>\n<body>\n\
    <h2>H8-LAN board BS MENU</h2>\n<hr>\n\
    <blockquote>\n <p>BS page</p>\n </blockquote>\n\
    <a href=\"home.html\">HOME</a>\n <hr></body></html>\n" ;
    int i ;

    http_header() ;
    for ( i = 0 ; i < 6 ; i ++ ) {
        ht_write(" TEST TEST TEST TEST TEST TSET TES TEST TEST <BR>\n") ;
    }
    ht_write((char *)main_html) ;
    ht_flash();
}

int http_recv(int flag, int sock, struct sockaddr_in *addr) {
    char com[8], ver[16] ;
    char *ptr1, *ptr2; int  n;

    socket = sock ;
    printf("http_recv flag=%d\n",flag) ;
    address = addr ;
    switch(flag) {
    case TCP_DATA:
        n = tcp_read(buffer, 255);
        ptr1 = buffer; ptr2 = strchr(buffer, ' '); *ptr2 = 0;
        strcpy(com, ptr1);
        ptr1 = ptr2 + 1; ptr2 = strchr(ptr1, ' '); *ptr2 = 0;
        strcpy(cname, ptr1);
        ptr1 = ptr2 + 1; ptr2 = strchr(ptr1, '\r'); *ptr2 = 0;
        strcpy(ver, ptr1);
        if ( strstr(com,"GET") == (char *)-1 ) {
            tcpclose(socket);
            return 0;
        }
        rflag = 1 ;
        break ;
    case TCP_CLOSE:
        tcpclose(socket);
        break ;
    default:
        break ;
    }
    return 0;
}


int tcp(unsigned short port, struct sockaddr_in *addr, unsigned char flag, int s
eq) {
    printf("SEQ=%d FLAG=%d\n",seq,flag) ;
    if(port != 80) return -1;
    if(flag & RST) return -1;
    if(!(flag & SYN)) return -1;
    socket = tcpsocket(seq, http_recv);
    return 0;
}

int dispa(char *buf) {
    const static char *cmd[] = { "home","calc","test","BS","hyou" } ;
    int i ;
    for ( i = 0 ; i < 5 ; i ++ ) {
        if ( strstr(buf,cmd[i]) != NULL ) return i ;
    }
    return 0 ;
}

int main(void) {

    write_mode(SIO) ;
    printf("PROGRAM START\n") ;
    http_index = 0 ;
    ether_init(0x200000);
    if(get_ether_status() == 0) return -1;
    ip_setup(IPADDR(192,168,1,200), IPADDR(255,255,255,000));
    tcp_regport(tcp);
    while (1) {
        if (rflag == 1 ) {
          tcp_unregport(tcp);
            rflag = 0 ;
            set_tcpaddr(address,80) ;
            switch (dispa(cname)) {
                case 0:
                    home_disp() ;
                    break ;
                case 1:
                case 2:
                case 3:
                case 4:
                    BS_disp() ;
                    break ;
                default :
                    break ;
            }
          tcp_regport(tcp);
        }
    }
    return 0 ;
}

-- 
Nishimoto Hiroshi mailto:nsmt@xxxxxxxxxxxxxxxx
スレッド概略
[表示中](起点)
 ├[1756(1)]
 ├[1757(2)]
 └[1774(3)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]