void d_print(point **p, distance* d) { printf("("); p_print(p[d->i]); printf(")-("); p_print(p[d->j]); printf(")"); printf("=%.2f", d->d); }
/* * ホスト名からアドレスをとってきて connectしたソケットをかえす * * Windowsでは、ノンブロッキングのconnectをつくる方法がわからなかった。 * ので、ふつうにブロックするバージョんをまずつくってみる。 * * かえりち: * -1 : gethostbyname error ( siteがみつからんとかいう ) * -2 : socket error * -3 : connect error * -4 : 回復できない内部エラー(ばぐってます。) */ int p_connectToHTTPServer( char *h , int port ) { struct hostent* he; struct sockaddr_in sin; int sockfd; int r; sin.sin_family = AF_INET; sin.sin_port = htons( port ); sin.sin_addr.s_addr = inet_addr( h ); if( sin.sin_addr.s_addr == -1 ){ he = gethostbyname( h ); if( he == NULL ){ p_print( "gethostbyname err." ); return -1; } memcpy((void*)&sin.sin_addr.s_addr, he->h_addr, sizeof( struct in_addr)); } sockfd = socket( AF_INET , SOCK_STREAM , 0 ); if( sockfd <0 ){ p_printError( "socket error\n" ); return -2; } r = connect( sockfd , ( struct sockaddr*) &sin, sizeof( struct sockaddr_in )); if( r < 0){ p_print( "cannot connect\n"); return -3; } /* ソケットが初期化できたので、こんどは、Conに登録する。 */ if( con[sockfd].use ){ p_printError( "in p_connectToServer: Con array inconsistency\n"); return -4; } fprintf( stderr , "created client socket fd%d\n",sockfd); con[sockfd].use = 1; con[sockfd].rbuse = con[sockfd].wbuse = 0; con[sockfd].type = CONTYPE_SV; con[sockfd].id = p_createNewSocketID(); con[sockfd].state = CONSTATE_HTTP_HEADER; con[sockfd].close_flag = 0; con[sockfd].asoc_id = -1; return sockfd; }
void t_print(Text text) { Piece p = text.head; do { p_print(p); p = p->next; } while(p != NULL); }
/* 一般化用関数。このプロトタイプは common.h にあり 初期化されたサーバソケットをかえす しっぱいしたら負ね.成功したら正の値 とりあえず ftp についてはほったらかし http_port からはじめるが bind エラーがでたら1づつふやしてためす。 100かいやってだめだったらあきらめる。 */ int p_initServerSocket( int http_port , int ftp_port ) { int i; int ret; int s; /* まず HTTP をやる */ for( i = 0 ;i < 100;i++){ struct sockaddr_in sin; s = socket( AF_INET , SOCK_STREAM , 0 ); if( s < 0 ) return s; bzero( &sin , sizeof( sin )); sin.sin_port = htons( http_port + i ); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; ret = bind( s , (struct sockaddr*)&sin, sizeof(struct sockaddr_in )); if( ret < 0 ){ close( s ); continue; } else { break; } } if( i == 100 ) return -100; if( i > 0 ){ char msg[100]; sprintf( msg , "Bound on port: %d\n" , http_port + i ); p_print( msg); } ret = listen( s , 5 ); if( ret < 0 ){ p_printError( "listen error!\n"); } p_print( "server socket ok\n" ); return s; }