基于消息的异步套接字
首先加载套接字库
#include <winsock2.h> //套接字库头文件
还需要为工程添加连接ws2_32.lib
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2,2);
err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return FALSE;
}
if(LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) !=2)
{
WSACleanup();
return FALSE;
}
创建并初始化套接字
BOOL ::InitSocket
{
m_socket = WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0); //m_scoket为SCOKET类型在头文件中定义
if(INVALID_SOCKET == m_socket)
{
AfxMessagebox("创建套接字失败!");
return;
}
SOCKADDR_IN addrSock;
addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl 将u_long从主机字节顺序转换为TCP/IP网络字节顺序
addrSock.sin_family = AF_INET;
addrSock.sin_port = htons(6000); //htons 将u_short从主机字节顺序转换为TCP/IP网络字节顺序
if(SOCKET_ERROR == bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
{
AfxMessageBox("绑定失败! ");
return FALSE;
}
if(SOCKET_ERROR == WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ)) //UM_SOCK自定义消息,m_hWnd对话框窗口句柄
{
AfxMessageBox("注册网络读取时间失败!");
return FALSE;
}
return TRUE;
}
实现接收端功能
添加消息响应函数
#define UM_SOCK WM_USER+1
afx_msg void OnSock(WPARAM,LPARAM);
ON_MESSAGE(UM_SOCK,OnSock)
void ::OnSock(WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf = new char[200];
wsabuf.len = 200;
DWORD dwRead;
DWORD dwFlag = 0;
SOCKADDR_IN = addrFrom;
int len = sizeof(SOCKADDR);
CString strl;
CString strTemp;
if(SOCKET_ERROR == WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
(SOCKADDR*)&addrFrom,&len,NULL,NULL)
{
AfxMessageBox("接收数据失败!");
delete[] wsabuf.buf;
return;
}
}
}
实现发送端功能
void ::OnBtnSend()
{
DWORD dwIP;
CString strSend;
WSABUF wsabuf;
DWORD dwSend;
int len;
SOCKADDR_IN addrTo;
((CIPAddressCtrl*)GetDlgItem(IDC_IPASSRESS1))->GetAddress(dwIP); //IDC_IPASSRESS1 ,IP控件的ID
addrTo.sin_addr.S_un.S_addr = htonl(dwIP);
addrTo.sin_family = AF_INET;
addrTo.sin_port = htons(6000);
GetDlgItemText(IDC_EDIT_SEND,strSend); //发送数据EDIT的ID
len = strSend.GetLength();
wsabuf.buf = strSend.GetBuffer(len);
wsabuf.len = len + 1;
if(SOCKET_ERROR == WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
SetDlgItemText(IDC_EDIT_SEND,""); //清空发送编辑框
(SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
{
AfxMessageBox("是、发送数据失败!");
return;
}
}
终止套接字库的使用
WSACleanup();
关闭套接字
closesocket(m_socket);
转载于:https://www.cnblogs.com/pbreak/archive/2010/06/05/1752333.html
基于消息的异步套接字相关推荐
- Lesson16基于消息的异步套接字聊天室程序 VS2013 VC++深入详解 孙鑫
Table of Contents 新建项目 UI设置 项目Project设置 代码 Chat.cpp ChatDlg.h : header file ChatDlg.cpp TODO: 新建项目 M ...
- 孙鑫MFC笔记之十四--多线程同步与异步套接字编程
线程同步有三种方式: 1. 互斥对象涉及方法: HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); //第二个参数为FALSE,将互斥对象声明为空闲状态 ...
- 线程同步与异步套接字编程
1.利用事件对象来实现线程间的同步 新建一个win32 console application,取名Event,再建一个Event源文件,编辑: #include <iostream.h> ...
- MFC(线程同步与异步套接字,孙鑫C++第十六讲笔记整理)
1.事件对象:来实现线程的同步.与互斥对象一样均属于内核对象. 当人工重置有信号时,所有线程均得到信号,所以不能设为人工重置.代码就不贴了,通过创建匿名的事件对象,也可以让一个程序只能运行一个实例. ...
- 基于UDP协议的套接字+socketserver模块
基于UDP协议的套接字 user datagram protocal 数据报协议 无双向通道.自带报头.类似发短信.不会粘包 不可靠:数据发送时,丢就丢了 UDP socket: 服务端: impor ...
- day26-2 基于TCP协议的套接字编程
目录 基于TCP协议的套接字编程 套接字 套接字工作流程 基于TCP协议的套接字编程(简单) 服务端 客户端 基于TCP协议的套接字编程(循环) 服务端 客户端1 客户端2 基于TCP协议的套接字编程 ...
- udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识
基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...
- 关于.NET中socket中的异步套接字的研究二
三 异步套接字 虽然还有许多别的方法解决同步套接字中的问题的方法,但是综合比较来看,异步套接字无疑是大多数情况下最好的解决办法,这个问题稍后讨论. 1 原理 首先来说一下异步的原理(根据自己的理解写的 ...
- 20181225 基于TCP/IP和基于UDP/IP的套接字编程
一.TCP/IP的套接字编程 服务器端代码: import socketserver = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.socke ...
最新文章
- 互联网协议 — IPv4 — CIDR 网络地址表示法
- java 原生sql排序 gbk_04-SQLServer的排序规则(字符集编码)
- jqueryui dialog asp.net服务端控件失效问题解决
- 如何修改layui数据表格绑定的开关事件?
- 【云周刊】第163期:中国唯一,阿里云进入Forrester大数据服务榜单
- 【软件工具使用】IDM安装、设置及常见问题解决方法
- Cadence Allegro编辑元件属性图文教程及视频演示
- linux命令获取显示器信息,如何确定液晶显示器是否从Linux命令行打开
- Android抓包工具Charles(青花瓷)
- viewHolder的作用
- 台湾骑行环岛攻略(转)
- 2021年CKA考试真题(二)
- mysql localhost可以连接,输入ip地址连接访问被拒绝
- Python爬取拉钩招聘网,告诉你:这类程序员最赚钱!
- 纯干货分享,2021年阿里巴巴社招面试题总结,本人上周已成功入职!
- pdf太大了不能上传怎么办?
- JETT(五)-支持Excel公式
- python爬虫中遇到“\xb5”、“xa0”等字符时报错编码错误的处理方式
- 使用Python将微信和支付宝账单导入随手记
- Android实现资源动态加载的两种方式
热门文章
- 打不开_笔记本电脑摄像头打不开怎么办
- oracle bucket trace,Frequent generate a lot of cdmp* directories contain *bucket trace in bdump
- mysql in语句 索引,MySQL 中索引相关 SQL 语句
- keil中如何查看代码大小
- nand flash驱动编写步骤
- 机器学习 集成学习理论基础 随机森林+adaboost
- 又一次Java线程卡死的调试经历
- 用Java搭建一套访问redis的API
- QTableView双击 单机事件信号
- PHP学习8——图像处理