クライアント長いリンク再接続メカニズム

// 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"); 
}

  

おすすめ

転載: www.cnblogs.com/hshy/p/10991323.html