サーバ
// 処理スレッドは、一つのクライアントの情報受信 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) + 1、0 ); } 戻り 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を返します。
}