用WSAStartup,需要在StdAfx.h头文件中需要声明

#include   
#pragma   comment(lib,"WS2_32.lib")

用AfxSocket,需要在StdAfx.h头文件中需要声明

#include

用到了两种,则需要:

#include   
#pragma   comment(lib,"WS2_32.lib")

#include   

上述方法是否可行,需要验证?(在三门峡自动化收购管理系统中,用到了上述内容)

1、在【项目名.cpp】文件BOOL CXxxApp::InitInstance ()中添加代码:

                // 加载套接字库

                 WORD wVersionRequested ;

                 WSADATA wsaData ;

                 int err ;

 

                 wVersionRequested = MAKEWORD (2, 2);

                 err = WSAStartup (wVersionRequested, & wsaData);

                 if (err != 0)

                {

                                 MessageBox(NULL , _T( "启动异步套接字失败!" ), _T( "提示"), MB_OK );

                                 return FALSE ;

                }

                 if (LOBYTE (wsaData. wVersion) != 2 || HIBYTE (wsaData. wVersion) != 2)

                {

                                 WSACleanup();

                                 MessageBox(NULL , _T( "Socket版本错误!" ), _T( "提示"), MB_OK );

                                 return FALSE ;

                }

 

2、析构函数中

CLineControlApp::~CLineControlApp ()

{

                 // TODO: add construction code here,

                 // Place all significant initialization in InitInstance

                 WSACleanup();

}

 

3、在头文件中

 

#define UM_SOCK              WM_USER + 1  // Socket接收到信息

 

在类中定义套接字

SOCKET m_socket ; // 套接字描述符

 

BOOL InitSocket (void);

 

//afx_msg void OnSock(WPARAM wParam , LPARAM lParam );  // VC6

afx_msg LRESULT OnSock(WPARAM wParam , LPARAM lParam );  // VC2005以上

 

 

4、创建并初始化套接字

// 创建并初始化套接字

BOOL CZdhsgDlg ::InitSocket( void)

{

                 m_socket = WSASocket (AF_INET, SOCK_DGRAM, 0, NULL , 0, 0);

                 if (INVALID_SOCKET == m_socket)

                {

                                 MessageBox(_T ("套接字创建失败!"), _T ("错误"));

                                 return FALSE ;

                }

                 // 地址结构体

                 SOCKADDR_IN addrSock ;

                 addrSock.sin_family = AF_INET;

                 addrSock.sin_port = htons(20131);

                 addrSock.sin_addr .S_un. S_addr = htonl (INADDR_ANY);

                 ////////////////////////////////////////称重线程接收报错1054,增加该函数

                 DWORD dwBytesReturned = 0;

                 BOOL bNewBehavior = FALSE;

                 DWORD status ;

                 status = WSAIoctl (m_socket, SIO_UDP_CONNRESET, &bNewBehavior , sizeof( bNewBehavior), NULL, 0, &dwBytesReturned , NULL, NULL);

 

                 // 接收缓冲区

                 int nRecvBuf = 128 * 1024; // 设置为128K

                 setsockopt(m_socket , SOL_SOCKET, SO_RCVBUF, (const char*)& nRecvBuf, sizeof (int));

                 // 发送缓冲区

                 int nSendBuf = 128 * 1024; // 设置为128K

                 setsockopt(m_socket , SOL_SOCKET, SO_SNDBUF, (const char*)& nSendBuf, sizeof (int));

 

                 //////////////////////////////////////////

                 // 绑定套接字

                 if (SOCKET_ERROR == bind( m_socket, (SOCKADDR *)&addrSock, sizeof(SOCKADDR )))

                {

                                 MessageBox(_T ("绑定套接字失败!"), _T ("错误"));

                                 return FALSE ;

                }

                 // 请求一个基于Windows消息的网络事件通知

                 if (SOCKET_ERROR == WSAAsyncSelect( m_socket, m_hWnd , UM_SOCK, FD_READ))

                {

                                 MessageBox(_T ("注册网络读取事件失败!" ), _T( "错误"));

                                 return FALSE ;

                }

 

                 return TRUE ;

}

 

 

5、在CPP文件中:

OnInitDialog ()中加入:InitSocket();

 

BEGIN_MESSAGE_MAP (CZdhxtEmulatorDlg, CDialogEx)

                 ON_WM_SYSCOMMAND()

                 ON_WM_PAINT()

                 ON_WM_QUERYDRAGICON()

                 ON_MESSAGE (UM_SOCK , OnSock) // 加入这一行代码

END_MESSAGE_MAP()

 

 

6、OnSock()

LRESULT CZdhsgDlg ::OnSock( WPARAM wParam , LPARAM lParam)

{

                 CString temp ;

 

                 switch(LOWORD (lParam))

                {

                 case FD_READ :

                                 WSABUF wsabuf ;

                                 wsabuf.buf = new char[200];

                                 wsabuf.len = 200;

                                 DWORD dwRead = 0;

                                 DWORD dwFlag = 0;

                                 SOCKADDR_IN addrFrom ;

                                 int len = sizeof( SOCKADDR);

                                 // WSARecvFrom接收数据报类型的数据,并保存数据发送方地址

                                 if (SOCKET_ERROR == WSARecvFrom( m_socket, &wsabuf , 1, &dwRead, & dwFlag, (SOCKADDR*)&addrFrom , &len, NULL, NULL ))

                                {

                                                 temp.Format (_T( "Socket接收数据失败:%d" ), WSAGetLastError());

                                                 AddLog(temp );

                                                 delete[] wsabuf .buf;

                                                 return FALSE ;

                                }

 

                                 CString address ;

                                 address.Format (_T( "%s"), inet_ntoa (addrFrom. sin_addr));

 

                                 if (dwRead < 1)

                                {

                                                 temp.Format (_T( "Socket未接收到数据!来自:%s" ), address);

                                                 AddLog(temp );

                                                 delete[] wsabuf .buf;

                                                 return FALSE ;

                                }

 

                                 /*CString str;

                                str.Format(_T("%s\t%s"), inet_ntoa(addrFrom.sin_addr), wsabuf.buf);

                                WriteSgxtLog(str);*/

 

                                 BYTE *data ;       // 保存从接收缓冲区中提取的数据包

                                 data = new BYTE[ dwRead];

                                 memset(data , 0, dwRead);

                                 memcpy(data , wsabuf. buf, dwRead ); // nRevData[0]中存放的是数据包的有效长度lRevDataLen

                                 //CheckReceiveData(address, data, dwRead);

                                 m_dataChecker.CheckReceiveData (address, data, dwRead , this-> GetSafeHwnd());

 

                                 delete[] wsabuf .buf;

                                 break;

                }

 

                 return TRUE ;

}

 

7、析构函数

CZdhsgDlg::~CZdhsgDlg ()

{

                 if (m_socket )

                {

                                 closesocket(m_socket );

                }

}

 本文用菊子曰发布

VC基于消息的异步套接字的更多相关文章

  1. 【转】 VC中TCP实现 异步套接字编程的原理+代码

    所谓的异步套接字编程就是  调用了 如下函数   WSAAsyncSelect   设置了 套接字的状态为异步,有关函数我会在下面详细介绍... 异步套接字解决了 套接字编程过程中的堵塞问题 .... ...

  2. 孙鑫MFC学习笔记16:异步套接字

    16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...

  3. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  4. 网络编程基础:粘包现象、基于UDP协议的套接字

    粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...

  5. 网络编程(四)--基于udp协议的套接字、socketserver模块

    一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头                  ...

  6. 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket

    目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...

  7. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  8. python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...

  9. 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用

    基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...

随机推荐

  1. [转] MovieClip转Bitmap方法

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Loader; ...

  2. Sorted Union

    function unite(arr1, arr2, arr3) { //return arr1; var args = Array.from(arguments); var arr = args.r ...

  3. 如何编译Less

    什么是LESS LESSCSS是一种动态样式语言,属于CSS预处理语言的一种.它编译后就是CSS了,大名鼎鼎的前端框架BootStrap就是用这个语言写的 下面示范下怎么用LESS编译成CSS,尽量简 ...

  4. dede列表页分页地址优化(不同url相同内容问题解决)<转自http://www.966266.com>

    <注明,完全转自http://www.966266.com/seoblog/?p=75> 存在问题 DEDE默认分类分页地址存在不同URL相同内容问题,导致内容重复,对SEO非常不利.情况 ...

  5. 韩服MU

    ※◆☆★☆◆※欢迎使用!!!如有问题或新功能需求请联系作者QQ:82850696*4*您使用的测试版已到期,如需继续使用,请联系作者 QQ : 82850696*0*2015-1-7 23:59:59 ...

  6. 使用12c的DBCA创建数据库的时候报错TNS-04404

    情况:之前使用的默认的pdb数据库pdborcl,连接的时候使用SQLdeveloper,配置了tnsname.ora,里面添加了pdborcl的service:这里报错是感觉tnsname配置错误了 ...

  7. discuz学习,文件列表

    文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了,其实我也不推荐修改这些文件 绿色:函数类文件,许多功能强大的自定义函数可以调用 ...

  8. 中值排序的java实现

    public class MidSort { public static void main(String[] args){ ,,,,,,,,}; midSort(arr,,); for(int i: ...

  9. C# Delegate 匿名 Delegate

    C#6.0新添加了 lambda的强力支持,用lambda的确可以节省好多代码,让代码看起来更简洁,更直观: 这里做一个笔记,C#的匿名委托 Demo class Program { static v ...

  10. [Leetcode][JAVA] Word Ladder II

    Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...