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");}}
- Socket异步发送接收,Windows
- 异步 SOCKET 编程 - 发送和接收数据
- 异步 SOCKET 编程 - 发送和接收数据
- 异步SOCKET编程-发送和接收数据
- 异步 SOCKET 编程 - 发送和接收数据
- 异步 SOCKET 编程 - 发送和接收数据
- 异步SOCKET编程-发送和接收数据
- 异步SOCKET编程-发送和接收数据
- 异步 SOCKET 编程 - 发送和接收数据
- 异步SOCKET编程-发送和接收数据[转] 异步SOCKET编程-发送和接收数据[转]
- windows socket编程,连续发送接收
- [转]异步SOCKET编程-发送和接收数据
- 异步SOCKET编程-发送和接收数据[转]
- 异步SOCKET编程-发送和接收数据[转]
- C++socket客户端select异步连接发送接收数据
- Tcp异步接收发送
- windows下使用WSAEVENTSELECT实现同步发送异步接收
- socket 发送与接收
- 使用apache commons包读取配置文件【转】
- 获取java项目根目录
- Android中全屏或者取消标题栏
- Selenium 处理富文本
- ANDROID 隐藏 任务栏 systemui systembar 全屏显示
- Socket异步发送接收,Windows
- jQuery验证控件jquery.validate.js使用说明
- [Openstack]client api源码学习
- Java编程中写出好代码的建议
- jsp页面跳转常用方法,原谅我是菜鸟
- 12.6
- linux i2c驱动分析
- Android ListView更换点击效果
- Java程序员的推荐阅读书籍