用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 ; // 套接字描述符
//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中TCP实现 异步套接字编程的原理+代码
所谓的异步套接字编程就是 调用了 如下函数 WSAAsyncSelect 设置了 套接字的状态为异步,有关函数我会在下面详细介绍... 异步套接字解决了 套接字编程过程中的堵塞问题 .... ...
- 孙鑫MFC学习笔记16:异步套接字
16 1.事件对象 2.CreateEvent创建事件对象 3.SetEvent设置事件对象为通知状态 4.ResetEvent设置事件对象为非通知状态 5.InitializeCriticalSec ...
- 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
一.客户端/服务器架构(C/S架构) 即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...
- 网络编程基础:粘包现象、基于UDP协议的套接字
粘包现象: 如上篇博客中最后的示例,客户端有个 phone.recv(2014) , 当服务端发送给客户端的数据大于1024个字节时, 多于1024的数据就会残留在管道中,下次客户端再给服务端发命令时 ...
- 网络编程(四)--基于udp协议的套接字、socketserver模块
一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. 以太网头 ip头 ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- python 之 网络编程(基于TCP协议的套接字通信操作)
第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...
- python 之 网络编程(基于UDP协议的套接字通信)
8.5 基于UDP协议的套接字通信 UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes 缺点:不可靠:发送数据,无需 ...
- 网络编程(四)——基于udp协议的套接字socket、socketserver模块的使用
基于udp协议的套接字.socketserver模块 一.UDP协议(数据报协议) 1.何为udp协议 不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包. ...
随机推荐
- 前端开发必备! 20 个强大的 Sublime Text 插件
http://www.oschina.net/translate/20-powerful-sublimetext-plugins http://www.w3cplus.com/tools/emmet- ...
- 对需要聚类的数据使用canopy做初步的计算
K值聚类的时候,需要自己指定cluster的数目. 这个cluster数目一般是通过canopy算法进行预处理来确定的. canopy具体描述可以参考这里. 下面是 golang语言的一个实现(对经纬 ...
- Asp.Net MVC4入门指南(2):添加一个控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
- TableView刷新指定的cell 或section
//一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:]; [tableview reloadSections:ind ...
- POJ 3181 Dollar Dayz DP
f[i][j]=f[i-j][j]+f[i][j-1],结果很大需要高精度. //#pragma comment(linker, "/STACK:1024000000,1024000000& ...
- 【转】进程与CPU
声明:本博客转自:http://blog.chinaunix.net/uid-20737871-id-1881246.html 简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 C ...
- [php-src]一个Php扩展的结构
内容均以php5.6.14为例. 要拥有一个PHP扩展的架子,使用源码中准备好的 /ext/ext_skel 工具,可以生成一个可运行的扩展骨架. 不加选项运行 ./ext_skel,可查看所有可用选 ...
- 模板短信接口调用java,pythoy版(一) 网易云信
说明 短信服务平台有很多,我只是个人需求,首次使用,算是测试用的,故选个网易(大公司). 稳定性:我只测试了15条短信... 不过前3条短信5分钟左右的延时,后面就比较快.... 我只是需要发短信,等 ...
- Titanium系列--安装Titanium Studio 中的Android SDK,JDK以及环境变量的配置(二)
Ubuntu安装配置JDK 1.先去 Oracle下载Linux下的JDK压缩包,我下载的是jdk-8u25-linux-x64.tar.gz文件,下好后直接解压 Step1:# 将解压好的jdk1. ...
- spring-data-elasticsearch整合elasticsearch
花了一个晚上 整合最新版本的spring-data-elasticsearch与elasticsearch,遇到各种版本冲突 之类的问题,测试效果如图: facet搜索: