现在的位置: 首页 > 综合 > 正文

Socket异步发送接收,Windows

2018年10月04日 ⁄ 综合 ⁄ 共 3442字 ⁄ 字号 评论关闭

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

}

抱歉!评论已关闭.