From pc-sig-request@tkyux.phys.s.u-tokyo.ac.jp Fri Jan 19 15:43:19 1996 Date: Fri, 19 Jan 96 15:40:49 JST From: Hirofumi Fujii Message-Id: <9601190641.AA13195@onlnews.kek.jp> To: pc-sig@phys.s.u-tokyo.ac.jp Subject: Win32 console and BSDsocket Resent-Message-Id: <"qk7jz3.0.bD1.trp_m"@tkyux> Resent-From: pc-sig@tkyux.phys.s.u-tokyo.ac.jp X-Mailing-List: archive/latest/780 X-Loop: pc-sig@tkyux.phys.s.u-tokyo.ac.jp Reply-To: pc-sig@tkyux.phys.s.u-tokyo.ac.jp Precedence: list Resent-Sender: pc-sig-request@tkyux.phys.s.u-tokyo.ac.jp Status: RO 藤井啓文@KEKです 以前、Win95/NT の DOS 窓は MS-DOS にあらずという 議論をしましたが、ふと、console 窓で BSD socket application が、ほぼ Unix と同じように 書けるのではないかと思い、試してみました。 思った通り、全くすんなり動いてしまいました。 注意しなければいけないのは、Win31 と同様、 最初に WSAStartup() 、最後に WSACleanup() が必要なこと、 変数や関数の型に注意すること位です。 Console application は、どうも前もって、Window 関連 の処理をやってくれているようでで、書くのは実に楽です。 例によって、daytime client program を添付しておきます。 # 次は multi-thread 調べてみるかな、、 -- save as cdaytime.c ------------------------------ /* A simple TCP/IP daytime client program for WIN32 console mode * * Author: * Hirofumi Fujii (KEK Online Group) * Date: * 18-Jan-1996 * Compiler: * Microsoft Visual C++ Version 2.0 * Make (in cosole window): * cl cdaytime.c wsock32.lib */ #define STRICT #include #include #include #include #define RECVBUFSIZE 80 void main( int argc, char *argv[] ) { WSADATA wsadata; /* WINSOCK data */ WORD wsaversion; SOCKET clisock; struct sockaddr_in sockname; int nrecv; static char recvbuf[RECVBUFSIZE]; /* Check the arguments */ if( argc != 2 ) { fprintf( stderr, "Usage: %s IP_address\n", argv[0] ); return; } /* WINSOCK startup */ wsaversion = 0x0101; if( WSAStartup( wsaversion, &wsadata ) != 0 ) { fprintf( stderr, "Cannot start WINSOCK\n" ); return; } if( (clisock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )) == INVALID_SOCKET ) { WSACleanup(); fprintf( stderr, "Invalid Socket\n" ); return; } memset( &sockname, 0, sizeof( sockname ) ); sockname.sin_family = AF_INET; sockname.sin_port = htons( IPPORT_DAYTIME ); sockname.sin_addr.s_addr = inet_addr( argv[1] ); if( sockname.sin_addr.s_addr == INADDR_NONE ) { closesocket( clisock ); WSACleanup(); fprintf( stderr, "Invalid IP address\n" ); return; } if( connect( clisock, (struct sockaddr *)&sockname, sizeof( sockname ) ) != 0 ) { closesocket( clisock ); WSACleanup(); fprintf( stderr, "Connection failure\n" ); return; } nrecv = recv( clisock, recvbuf, (RECVBUFSIZE - 1), 0 ); if( nrecv >= 2 ) nrecv -= 2; /* eliminate CR LF */ recvbuf[nrecv] = '\0'; closesocket( clisock ); WSACleanup(); printf( "Message from [%s]: %s\n", argv[1], recvbuf ); } ------------------------------------------------------- Hirofumi Fujii (KEK Online Group) keibun@onlnews.kek.jp