#include #include #include #include #include #include "outputLog.h" int main() { outputLog( "SV", "LC112Server START\n" ); int srcSocket; // 自分 int dstSocket; // 相手 struct sockaddr_in srcAddr; struct sockaddr_in dstAddr; socklen_t dstAddrSize = sizeof( dstAddr ); int iRet; char pcBuf[256]; // sockaddr_in 構造体のセット bzero( ( char* )&srcAddr, sizeof( srcAddr ) ); srcAddr.sin_port = htons( 9876 ); srcAddr.sin_family = AF_INET; srcAddr.sin_addr.s_addr = INADDR_ANY; // ソケットの生成(ストリーム型) srcSocket = socket( AF_INET, SOCK_STREAM, 0 ); if ( srcSocket < 0 ) { perror( "socket" ); return( -1 ); } // アドレス使用中エラーを回避する // これをしないと2回目のbindでエラーになる。 // socketはclose後も2〜4分残る模様 int on = 1; iRet = setsockopt( srcSocket , SOL_SOCKET , SO_REUSEADDR , &on , sizeof( on ) ); if ( iRet < 0 ) { perror( "setsockopt" ); return( -2 ); } // ソケットのバインド iRet = bind( srcSocket , ( struct sockaddr* )&srcAddr , sizeof( srcAddr ) ); if ( iRet < 0 ) { perror( "bind" ); return( -3 ); } // 接続の許可 iRet = listen( srcSocket, 1 ); if ( iRet < 0 ) { perror( "listen" ); return( -4 ); } // 接続の受付け outputLog( "SV", "接続を待っています\n" ); dstSocket = accept( srcSocket , ( struct sockaddr* )&dstAddr , &dstAddrSize ); outputLog( "SV", "accept OK\n" ); close( srcSocket ); int iProc = 1; while( iProc ) { int iInpt; outputLog( "SV", "----------------------------------\n" ); outputLog( "SV", "(1) send messase\n" ); outputLog( "SV", "(9) end\n" ); outputLog( "SV", "input number: " ); scanf( "%d", &iInpt ); switch( iInpt ) { case 1: // メッセージ送信 memset( pcBuf, 0x00, sizeof( pcBuf ) ); strcpy( pcBuf, "send server!!" ); iRet = write( dstSocket, pcBuf, strlen( pcBuf ) ); if ( iRet < 0 ) { perror( "write" ); return( -5 ); } outputLog( "SV", "send OK!!\n" ); break; case 9: outputLog( "SV", "終了します。\n" ); iProc = 0; break; default: outputLog( "SV", "番号を選んで下さい。\n" ); break; } } close( dstSocket ); outputLog( "SV", "LC112Server END\n" ); return( 0 ); }