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