读书人

socket 客户端断线重连的有关问题

发布时间: 2012-09-09 09:27:54 作者: rapoo

socket 客户端断线重连的问题。
[code=C/C++][/code]

//初始化WinSock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2),&wsaData)!=NO_ERROR)
{
std::cout<<"Initialization failed"<<std::endl;
return 0;
}
//创建套接字
SOCKET LocalSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (LocalSocket==INVALID_SOCKET)
{
std::cout<<"Create Socket failed"<<std::endl;
return 0;
}

// 设置超时信息
int nTimeOut = 3000 ;
::setsockopt(LocalSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nTimeOut,sizeof(int) ) ;

// 取得原始服务地址
char szHostName[DEF_BUF_SIZE]={0};
gethostname(szHostName,DEF_BUF_SIZE);
std::cout<<"ServerName:"<<szHostName<<std::endl;
hostent *pHost=gethostbyname(szHostName);
if (pHost==NULL)
{
std::cout<<"Get the Local IpAddress failed"<<std::endl;
return 0;
}
sockaddr_in RemoteAddr;
RemoteAddr.sin_family=AF_INET;
RemoteAddr.sin_port=htons(12345);
memcpy(&(RemoteAddr.sin_addr.s_addr),pHost->h_addr_list[0],pHost->h_length);

std::cout<<"ServerIp:"<<(int) RemoteAddr.sin_addr.S_un.S_un_b.s_b1<<"."
<<(int) RemoteAddr.sin_addr.S_un.S_un_b.s_b2<<"."
<<(int) RemoteAddr.sin_addr.S_un.S_un_b.s_b3<<"."
<<(int) RemoteAddr.sin_addr.S_un.S_un_b.s_b4<<std::endl
<<"Port:"<<(int) RemoteAddr.sin_port
<<std::endl;
// 连接服务器
if ( connect ( LocalSocket, (SOCKADDR*)&RemoteAddr, sizeof(SOCKADDR) ) == SOCKET_ERROR )
{
std::cout<<"Connet the Server failed"<<std::endl;
return 0;
}

// 发送请求(数据A和数据B)
char szData[DEF_BUF_SIZE] = {0} ;
sprintf (szData, "%s",buf) ;
int nSendSize = send ( LocalSocket, szData, DEF_BUF_SIZE, 0 ) ;
if ( nSendSize <= 0 )
{
std::cout<<"Send the Data failed"<<std::endl;
return 0;
}
closesocket ( LocalSocket ) ;
WSACleanup();


就是一个很简单,初级的客户端。。我想让它断线之后重新连接。。请问如何做?做好给点代码,帮忙改下也可以。。。

[解决办法]
定时器

connect 成功后,对于堵塞的,有返回值,保存返回值,


放在线程里做,

一段收不到服务器的回应,认为断线,重新去连接。

再加一个次数,如果3或者多少次,连接失败,退出线程。

告诉界面,无法连接。




读书人网 >C++

热点推荐