スレッドを接続する複数のクライアントを使用してWindowsソケットサーバー

サーバ

// 処理スレッドは、一つのクライアントの情報受信 
DWORD WINAPI ThreadFunc04(LPVOID のparamsを){ 
    SOCKET SKT =(SOCKET)のparamsを; 
    のsockaddr_in ADDR = { 0 };
     INT addrlenは= はsizeof (ADDR)、
    getpeername(SKT、(のsockaddr *)&ADDR 、&​​addrlenは); // 詳細はソケット得る

    チャー [bufを1024 ];
     int型RET;
     ながら真の){ 
        RET = RECV(SKT、BUF、はsizeof(BUF)を、0 );
         IF(RET ==SOCKET_ERROR){ 
            のprintf(" [サーバ] RECVソケット:%D IP:%sのポート:%Dエラー... \ n " 、SKT、INET_NTOA(addr.sin_addr)、ntohs(addr.sin_port))。
            破ります; 
        } 
        もし(保持== 0 ){ 
            のprintf(" [クライアント]ソケット:%D IP:%sのポート:%dの出口... N \ " 、SKT、INET_NTOA(addr.sin_addr)、ntohs(addr.sin_port) );
            破ります; 
        } 
        のprintf(" [クライアント]ソケット:%DのIP:%sのポート:%d個の\ n " 、SKT、INET_NTOA(addr.sin_addr)、ntohs(addr.sin_port))。
        printf(" [クライアント] MSG:%sの\ nは"BUF);
         場合(のstrcmp(BUF、" のgetName ")== 0 ){ 
            sprintfの(BUF、" %sの" " 爱白菜的小昆虫。" ); 
        } 
        そうでない 場合(のstrcmp(BUF、" getAge ")== 0 ){ 
            sprintfの(BUF、" %sの"" 100000 " ); 
        } 
        { 
            sprintfの(BUF、" %sの""????。" ); 
        } 

        送る(SKT、BUF、strlenを(BUF) + 10 ); 
    } 

    戻り 0 ; 
} 

// スレッドを使用して複数のクライアントに接続されたサーバ
int型function04は(){ 
    SOCKET sktServは INITを= (" 0.0.0.0 "8080 );
     IF(sktServは== {INVALID_SOCKETである)
         リターン - 1 ; 
    } 

    スレッドIDをDWORD; 
    SOCKET sktCli = INVALID_SOCKETである; 
    のsockaddr_in ADDR = { 0}。
    INT addrlenは= はsizeof (ADDR)。
    一方、){ 
        sktCli =(sktServ、(のsockaddr *)&ADDR、&受け入れるaddrlenは)を、
        もし(sktCli == INVALID_SOCKET){ 
            のprintf(" [クライアント] ... \ nはエラーを私達accpet " )。
            戻る - 1 
        } 
        のprintf(" [クライアント]ソケット:%D IP:%sのポート:%D受け入れる... \ N " 、sktCli、INET_NTOA(addr.sin_addr)、ntohs(addr.sin_port))。

        // 创建线程 
        のCreateThread(NULL、0、ThreadFunc04、(LPVOID)sktCli、0、&スレッドID)。
    } 

    (sktServ)を破壊します。
    リターン 0 ; 
}

クライアント

//客户端写数据
DWORD WINAPI ThreadFunc04(LPVOIDのparams){
SOCKETのSKT =(SOCKET)のparams。
int型のRET;
チャーBUF [1024]。
(TRUE){一方
のprintf( "*************************の\ n");
printf( "*のgetName * \ nを");
printf( "* getAge * \ nを");
printf( "*終了*の\ nを");
printf( "************************* \ nを");
scanf関数( "%sの"、BUF)。
IF(のstrcmp(BUF、 "出口")== 0){
破ります。
}
RET =(SKT、BUF、strlenを(BUF)+1、0)を送信します。
もし(RET == SOCKET_ERROR){
のprintf( "[クライアント]エラーを送信... \ nを");
-1を返します。
}
のprintf( "[クライアント]%sの成功を送る... \ nを"、bufが)。
RET = RECV(SKT、bufが、sizeof(BUF)、0);
IF(RET SOCKET_ERRORを==){
printf( "[クライアント]のrecvエラー... \ nを");
-1を返します。
}
IF(RET == 0){
のprintf( "[クライアント]サーバ出口... \ n");
-1を返します。
}
のprintf( "[サーバ]メッセージ:%Sの\ n"、BUF)。
}
0を返します。
}

//ソケットクライアントが受信し、スレッドが使用してメッセージを送信
function04(){int型
SOCKET sktCli INIT =( "192.168.3.18"、8080);
IF(== INVALID_SOCKETがsktCliある){
戻り-1;
}

hThreadをHANDLE;
DWORDザEXITCODE;
DWORDスレッドID;

hThread =のCreateThread(NULL、0、ThreadFunc04、(LPVOID)sktCli、0、&スレッドID)。
(TRUE){一方
GetExitCodeThread(hThread、&EXITCODE); //获取执行码

(!終了コード= STILL_ACTIVE)の場合{ // 終了スレッドが実行されます
BREAKを;
}
スリープ(1000);
}
CloseHandleを(hThread);

printf( "ReadThreadFunc04リターンは%d \ nを"、終了コード);
printf( "[クライアント]を実行エンド... \ nの");

(sktCli)を破壊。
0を返します。
}

おすすめ

転載: www.cnblogs.com/xuqiulin/p/11441249.html