Socket异步发送接收,Windows

来源:互联网 发布:我国教育经费机制知 编辑:程序博客网 时间:2024/04/26 22:10

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





原创粉丝点击