这是使用重叠io做的客户端,
但是当服务器当掉后
程序会在接收上产生错误,我怎么样在这时让程序和服务器自动重新连接呢????#include <winsock2.h>
#include <windows.h>
#include <stdio.h>#pragma comment (lib,"ws2_32.lib")
#define PORT 8888
#define DATA_BUFSIZE 8192void main(void)
{
WSADATA wsaData;
SOCKET ConnectSocket;
SOCKADDR_IN Remote;
INT Ret;
if ((Ret = WSAStartup(0x0202,&wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret);
WSACleanup();
return;
}
if ((ConnectSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Failed to get a socket %d\n", WSAGetLastError());
return;
}
memset(&Remote, 0, sizeof(Remote));
Remote.sin_family = AF_INET;
Remote.sin_addr.s_addr = inet_addr("92.0.0.27");
Remote.sin_port = htons(PORT);
WSAConnect(ConnectSocket,(sockaddr*)&Remote,sizeof(Remote),0,NULL,0,0);
WSAOVERLAPPED ol;
ZeroMemory(&ol,sizeof(ol));
WSAEVENT ev = WSACreateEvent();
ol.hEvent = ev;
char buf[DATA_BUFSIZE];
WSABUF wsaBuf;
DWORD nRecved;
DWORD flags;
memset(buf,0, DATA_BUFSIZE);
wsaBuf.len = DATA_BUFSIZE;
wsaBuf.buf = buf;
flags = 0;
nRecved = 0;
int i = 0;
while(1)
{
memset(buf,0, DATA_BUFSIZE);
wsaBuf.len = DATA_BUFSIZE;
wsaBuf.buf = buf;
flags = 0;
nRecved = 0;
if(WSARecv(ConnectSocket, &wsaBuf, 1, &nRecved, &flags, &ol, NULL) == SOCKET_ERROR)
{
if(WSAGetLastError() != WSA_IO_PENDING)
{
printf("3333333WSARECV error, %d\n", WSAGetLastError());
}
}
else if(nRecved == 0)
{
printf("server closed\n");
}
DWORD index = WSAWaitForMultipleEvents(1,&ev,FALSE,3000, FALSE);
if(index != 0)
{
printf("waitForEvent error\n");
}
else
{
WSAResetEvent(ev);
if(!WSAGetOverlappedResult(ConnectSocket, &ol, &nRecved, TRUE, &flags) )
{
printf( "get Over lap result error\n");
}
else
{
printf("%s, %d\n",wsaBuf.buf, i++);
}
}
}
WSACloseEvent(&ev);
closesocket(ConnectSocket);
WSACleanup();
}
但是当服务器当掉后
程序会在接收上产生错误,我怎么样在这时让程序和服务器自动重新连接呢????#include <winsock2.h>
#include <windows.h>
#include <stdio.h>#pragma comment (lib,"ws2_32.lib")
#define PORT 8888
#define DATA_BUFSIZE 8192void main(void)
{
WSADATA wsaData;
SOCKET ConnectSocket;
SOCKADDR_IN Remote;
INT Ret;
if ((Ret = WSAStartup(0x0202,&wsaData)) != 0)
{
printf("WSAStartup failed with error %d\n", Ret);
WSACleanup();
return;
}
if ((ConnectSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0,
WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
{
printf("Failed to get a socket %d\n", WSAGetLastError());
return;
}
memset(&Remote, 0, sizeof(Remote));
Remote.sin_family = AF_INET;
Remote.sin_addr.s_addr = inet_addr("92.0.0.27");
Remote.sin_port = htons(PORT);
WSAConnect(ConnectSocket,(sockaddr*)&Remote,sizeof(Remote),0,NULL,0,0);
WSAOVERLAPPED ol;
ZeroMemory(&ol,sizeof(ol));
WSAEVENT ev = WSACreateEvent();
ol.hEvent = ev;
char buf[DATA_BUFSIZE];
WSABUF wsaBuf;
DWORD nRecved;
DWORD flags;
memset(buf,0, DATA_BUFSIZE);
wsaBuf.len = DATA_BUFSIZE;
wsaBuf.buf = buf;
flags = 0;
nRecved = 0;
int i = 0;
while(1)
{
memset(buf,0, DATA_BUFSIZE);
wsaBuf.len = DATA_BUFSIZE;
wsaBuf.buf = buf;
flags = 0;
nRecved = 0;
if(WSARecv(ConnectSocket, &wsaBuf, 1, &nRecved, &flags, &ol, NULL) == SOCKET_ERROR)
{
if(WSAGetLastError() != WSA_IO_PENDING)
{
printf("3333333WSARECV error, %d\n", WSAGetLastError());
}
}
else if(nRecved == 0)
{
printf("server closed\n");
}
DWORD index = WSAWaitForMultipleEvents(1,&ev,FALSE,3000, FALSE);
if(index != 0)
{
printf("waitForEvent error\n");
}
else
{
WSAResetEvent(ev);
if(!WSAGetOverlappedResult(ConnectSocket, &ol, &nRecved, TRUE, &flags) )
{
printf( "get Over lap result error\n");
}
else
{
printf("%s, %d\n",wsaBuf.buf, i++);
}
}
}
WSACloseEvent(&ev);
closesocket(ConnectSocket);
WSACleanup();
}
这样
bool Connect()
{
if(InProcess == true)
return true;
WSAConnect(ConnectSocket,(sockaddr*)&Remote,sizeof(Remote),0,NULL,0,0);
}
在发送之前调用这个函数
是连接的状态吗?
怎么样得到这个连接的状态呢??
谢谢