はじめまして、西本と申します。 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