vdAsynSocket.h:
//
//Descript: ayncchronous socket
// Author:
// Date:2012.11.14
//
#pragma once
#include <WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
class CVDAsynSocket
{
public:
CVDAsynSocket();
~CVDAsynSocket();
public:
BOOL ConnectServer(char *pServerIP,int nServerPort);
int SendData(char *pData,int nDataLen);
int RecvData(char *pData,int nDataLen);
private:
void Init();
void UnInit();
private:
SOCKET m_sock;
};
vdAsynSocket.cpp:
//
//Descript: ayncchronous socket
// Author:
// Date:2012.11.14
//
#include "vdAsynSocket.h"
CVDAsynSocket::CVDAsynSocket() : m_sock(INVALID_SOCKET)
{
Init();
}
CVDAsynSocket::~CVDAsynSocket()
{
UnInit();
}
BOOL CVDAsynSocket::ConnectServer(char *pServerIP,int nServerPort)
{
if(INVALID_SOCKET == m_sock)
return FALSE;
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_addr.S_un.S_addr = inet_addr(pServerIP);
addrSrv.sin_port = htons((short)nServerPort);
int nRet = connect(m_sock,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR == nRet)
return FALSE;
return TRUE;
}
int CVDAsynSocket::SendData(char *pData,int nDataLen)
{
if(INVALID_SOCKET == m_sock)
return -1;
int nSend = 0;
int nHasSendDataLen = 0;
while(nHasSendDataLen < nDataLen)
{
nSend = send(m_sock, pData + nHasSendDataLen, nDataLen - nHasSendDataLen, 0);
if(SOCKET_ERROR == nSend)
return -1;
nHasSendDataLen += nSend;
}
return nDataLen;
}
int CVDAsynSocket::RecvData(char *pData,int nDataLen)
{
if(INVALID_SOCKET == m_sock)
{
return -1;
}
WSAOVERLAPPED wsaOverlap;
wsaOverlap.hEvent = WSACreateEvent();
if(NULL == wsaOverlap.hEvent)
{
return -2;
}
WSABUF wsaBuf;
DWORD dwRecv,dwFlags;
int nRet;
int nHasRecvDataLen = 0;
while(nHasRecvDataLen < nDataLen)
{
wsaBuf.buf = pData + nHasRecvDataLen;
wsaBuf.len = nDataLen - nHasRecvDataLen;
dwFlags = 0;
nRet = WSARecv(m_sock,&wsaBuf,1,&dwRecv,&dwFlags,&wsaOverlap,NULL);
if((SOCKET_ERROR == nRet) && (WSA_IO_PENDING != WSAGetLastError()))
{
WSACloseEvent(wsaOverlap.hEvent);
return -3;
}
nRet = WSAWaitForMultipleEvents(1,&wsaOverlap.hEvent,TRUE,WSA_INFINITE,TRUE);
if(WSA_WAIT_FAILED == nRet/* || WSA_WAIT_TIMEOUT == nRet*/)
{
WSACloseEvent(wsaOverlap.hEvent);
return -4;
}
if(WSA_WAIT_TIMEOUT == nRet)
{
WSACloseEvent(wsaOverlap.hEvent);
return -5;
}
nRet = WSAGetOverlappedResult(m_sock,&wsaOverlap,&dwRecv,FALSE,&dwFlags);
if(FALSE == nRet)
{
WSACloseEvent(wsaOverlap.hEvent);
return -6;
}
WSAResetEvent(wsaOverlap.hEvent);
if(0 == dwRecv)
{
WSACloseEvent(wsaOverlap.hEvent);
return nHasRecvDataLen;
}
nHasRecvDataLen += dwRecv;
}
WSACloseEvent(wsaOverlap.hEvent);
return nDataLen;
}
void CVDAsynSocket::Init()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
return;
}
m_sock = socket(AF_INET,SOCK_STREAM,0);
}
void CVDAsynSocket::UnInit()
{
closesocket(m_sock);
WSACleanup();
}
wsaclient.cpp:
#include <iostream>
using namespace std;
#include "vdAsynSocket.h"
void main()
{
CVDAsynSocket sock;
if(sock.ConnectServer("10.4.204.3",8952))
{
while(1)
{
char buf[20] = {0};
int nRet = -1;
if((nRet = sock.RecvData(buf,10)) > 0)
{
printf("buf:%s\n\n",buf+2);
int count = atoi(buf+2);
printf("recv1 %d bytes.\n",count);;
char *pData = new char[count + 1];
pData[count] = '\0';
if(sock.RecvData(pData,count) > 0)
{
printf("recv:%s\n\n",pData);
}
else
{
printf("RecvData 2 error.\n");
}
delete []pData;
}
else
{
printf("RecvData 1 error, nRet:%d.\n",nRet);
}
}
}
else
{
printf("ConnectServer error.\n");
}
}