服务器端select socket频繁连接客户端
主动连接端:
WSADATA wsaData;
//在这里初始化网络,初始化WSADATA结构
if (WSAStartup (MAKEWORD(2,2), &wsaData) != 0)
{
//ShowMessage("启动Socket 2.2库失败!!");
return false;
}
SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
SOCKADDR_IN addr_Term;
addr_Term.sin_family=AF_INET;
addr_Term.sin_addr.s_addr=inet_addr(Ip.c_str());
addr_Term.sin_port=htons(4804);
unsigned long ul=1;
int ret=ioctlsocket(sock,FIONBIO,(unsigned long *)&ul);
connect(sock,(struct sockaddr *)&addr_Term,sizeof(addr_Term));
//select 模式
struct timeval timeout;
fd_set r;
FD_ZERO(&r);
FD_SET(sock,&r);
timeout.tv_sec=0;
timeout.tv_usec=1000;
ret=select(0,0,&r,0,&timeout);
if(ret<=0)
{
unsigned long ull=0;
ret=ioctlsocket(sock,FIONBIO,(unsigned long *)&ull);
shutdown(sock,2);
closesocket(sock);
WSACleanup();
return false;
}
else
{
unsigned long ull=0;
ret=ioctlsocket(sock,FIONBIO,(unsigned long *)&ull);
shutdown(sock,2);
closesocket(sock);
WSACleanup();
return true;
}
客户端:
listen(sOnLineListen,5);
int iSize=sizeof(addr_OnLine_Remote);
do
{
sOnLineRecv=accept(sOnLineListen,(struct sockaddr *) &addr_OnLine_Remote,&iSize);
if(sOnLineRecv==INVALID_SOCKET)
{
//AfxMessageBox("accept error,"+WSAGetLastError());
closesocket(sOnLineRecv);
WSACleanup();
continue;
}
shutdown(sOnLineRecv,2);
closesocket(sOnLineRecv);
sOnLineRecv=INVALID_SOCKET;
}while(true);
主动连接端,每次这样连接客户端,就是为了检测一下客户端在不在就行了,
这是我想出来的办法,如果哪位认为还有更好的办法,给各提示也好,
没有更好的办法的话,看看这里有什么问题。
问题是:
隔次连接成功:一次可以连接上,一次又不可以,周而复始。
谢谢。