// testsocketclient.cpp:定义控制台应用程序的入口点 // の#include "stdafx.hを" の#include <winsock2.h> 書式#include <stdio.hに> する#include <mstcpip.h> の#pragmaコメント(libに"WS2_32.LIB") SOCKET sockClient = 0。 静的なint型のconn_status = 0; #define IP_ADDRESS( "192.168.207.131") の#define PORT(9099) の#include <iostreamの> 使用して名前空間std。 INT socket_tcp_alive(INTソケット) { int型RET = 0。 int型KEEP_ALIVE = 1; RET =のsetsockopt(ソケット、SOL_SOCKET、SO_KEEPALIVE、(チャー*)&KEEP_ALIVE、はsizeof(KEEP_ALIVE))。 (RET == SOCKET_ERROR)があれば 、{ 、:のprintfは( "%Dを\ nのsetsockoptに失敗しました" WSAGetLastError())。 -1を返します。 } tcp_keepaliveはin_keep_alive = 0 {構造体}; unsigned long型ul_in_lenにはsizeof(構造体tcp_keepaliveはを)=; 構造体= {0} tcp_keepaliveはout_keep_alive; unsigned long型ul_out_lenにはsizeof(構造体tcp_keepaliveはに)=; unsigned long型ul_bytes_return = 0; in_keep_alive.onoff = 1; / * *オープンキープアライブ/ in_keep_alive.keepaliveinterval = 5000; / *送信キープアライブハートビート間隔-ミリ秒* / in_keep_alive.keepalivetime = 1000; / *ロングキープアライブパケットは、パケットのハートビート送信を開始しませんでしたか-ミリ秒* / RET = WSAIoctl(ソケット、SIO_KEEPALIVE_VALS、(LPVOID)&in_keep_alive、ul_in_len、 (LPVOID)&out_keep_alive、ul_out_len、&ul_bytes_return、NULL、NULL); IF(SOCKET_ERRORのRETの==である) { printf( "WSAIoctlに失敗しました:%Dを\ n"、WSAGetLastError())。 { -1を返します。 } 0を返します。 } int型tcp_connect_server() { int型save_errno。 SOCKADDR_INのSERVER_ADDR。 conn_status = 0; memset(&SERVER_ADDR、0、はsizeof(SERVER_ADDR))。 server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr =のinet_addr(IP_ADDRESS)。 server_addr.sin_port = htons(PORT)。 sockClient = ::ソケット(PF_INET、SOCK_STREAM、0); (sockClient == -1)の場合 sockClientを返します。 conn_status = ::(sockClient、(sockaddr構造体の*)&SERVER_ADDR、はsizeof(SERVER_ADDR))を接続します。 IF(conn_status == -1) save_errno = errnoに、//清理 closesocket(sockClient)。 = save_errnoのerrno; //閉じるには、エラーであってもよい リターン-1; } //(数sockfd)をevutil_make_socket_nonblocking; sockClientを返す; } DWORD WINAPI monitorThread(LPVOID PM) { (1)一方 { チャーszRecvBuf [10] = {0}。 //送信(sockClientは、strlenを( "この強のge1234はIS") "このge1233が強IS" 1 +、0); int型= nRetのrecv(sockClient、szRecvBuf ,. 1、MSG_PEEK); //最後のパラメータがなければならないことに注意してくださいそれ以外の場合は、メインスレッドが情報を受信影響する、MSG_PEEKある IF(nRet <= 0) { のprintf( "それに監視:nRetである%D \ N-"、nRet); closesocket(sockClient); sockClient = NULL; // BREAK; sockClient tcp_connect_server =(); IF(!conn_status = -1) socket_tcp_alive(sockClient); } スリープ(5000); } の戻り0; } 無効メイン() { //ソケットライブラリ、バージョン交渉ロード WORD wVersionRequired; WSADATA WSADATA; int型のERRを; int型のステータス、save_errno; //要求ライブラリ // WSAStartupの(WORD wVersionRequired、WSADATA lpWSAData); wVersionRequired MAKEWORD =(1 ,. 1); ERR = WSAStartupの(wVersionRequired、&WSADATA); (!ERR = 0)IF { // 0に等しくありません出口 リターン; } //高及び低バイトはありません1。 IF(LOBYTE(wsaData.wVersion)= || HIBYTE 1(wsaData.wVersion)= 1 !!。。) { WSACleanup(); 返します。 } sockClient =ソケット(AF_INET、SOCK_STREAM、0); //設定サーバアドレス情報 SOCKADDR_IN addrSrv。 addrSrv.sin_addr.S_un.S_addr =のinet_addr(IP_ADDRESS)。 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(PORT)。 一方、(1) { conn_status =接続(sockClient、(SOCKADDR *)&addrSrv、はsizeof(SOCKADDR))。 IF(conn_status == -1) { save_errno = errnoに、//清理 のerrno = save_errno。//閉じることができるエラー スリープ(3000)。 裁判所未満<< "1つのLIANテスト" <<てendl; 持続する; } 他 { socket_tcp_alive(sockClient)。 ブレーク; } } HANDLEハンドル=のCreateThread(NULL、0、monitorThread、NULL、0、NULL); //(strlenを()+ 1、0 "これは強GEある" "これは強GEある"、sockClient)を送ります。 getchar関数(); closesocket(sockClient)。 WSACleanup(); システム( "PAUSE"); }