首先加载套接字库

#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

基于消息的异步套接字相关推荐

  1. Lesson16基于消息的异步套接字聊天室程序 VS2013 VC++深入详解 孙鑫

    Table of Contents 新建项目 UI设置 项目Project设置 代码 Chat.cpp ChatDlg.h : header file ChatDlg.cpp TODO: 新建项目 M ...

  2. 孙鑫MFC笔记之十四--多线程同步与异步套接字编程

    线程同步有三种方式: 1.      互斥对象涉及方法: HANDLE hMutex=CreateMutex(NULL,FALSE,NULL); //第二个参数为FALSE,将互斥对象声明为空闲状态 ...

  3. 线程同步与异步套接字编程

    1.利用事件对象来实现线程间的同步 新建一个win32 console application,取名Event,再建一个Event源文件,编辑: #include <iostream.h> ...

  4. MFC(线程同步与异步套接字,孙鑫C++第十六讲笔记整理)

    1.事件对象:来实现线程的同步.与互斥对象一样均属于内核对象.  当人工重置有信号时,所有线程均得到信号,所以不能设为人工重置.代码就不贴了,通过创建匿名的事件对象,也可以让一个程序只能运行一个实例. ...

  5. 基于UDP协议的套接字+socketserver模块

    基于UDP协议的套接字 user datagram protocal 数据报协议 无双向通道.自带报头.类似发短信.不会粘包 不可靠:数据发送时,丢就丢了 UDP socket: 服务端: impor ...

  6. day26-2 基于TCP协议的套接字编程

    目录 基于TCP协议的套接字编程 套接字 套接字工作流程 基于TCP协议的套接字编程(简单) 服务端 客户端 基于TCP协议的套接字编程(循环) 服务端 客户端1 客户端2 基于TCP协议的套接字编程 ...

  7. udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识

    基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...

  8. 关于.NET中socket中的异步套接字的研究二

    三 异步套接字 虽然还有许多别的方法解决同步套接字中的问题的方法,但是综合比较来看,异步套接字无疑是大多数情况下最好的解决办法,这个问题稍后讨论. 1 原理 首先来说一下异步的原理(根据自己的理解写的 ...

  9. 20181225 基于TCP/IP和基于UDP/IP的套接字编程

    一.TCP/IP的套接字编程 服务器端代码: import socket​server = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.socke ...

最新文章

  1. 互联网协议 — IPv4 — CIDR 网络地址表示法
  2. java 原生sql排序 gbk_04-SQLServer的排序规则(字符集编码)
  3. jqueryui dialog asp.net服务端控件失效问题解决
  4. 如何修改layui数据表格绑定的开关事件?
  5. 【云周刊】第163期:中国唯一,阿里云进入Forrester大数据服务榜单
  6. 【软件工具使用】IDM安装、设置及常见问题解决方法
  7. Cadence Allegro编辑元件属性图文教程及视频演示
  8. linux命令获取显示器信息,如何确定液晶显示器是否从Linux命令行打开
  9. Android抓包工具Charles(青花瓷)
  10. viewHolder的作用
  11. 台湾骑行环岛攻略(转)
  12. 2021年CKA考试真题(二)
  13. mysql localhost可以连接,输入ip地址连接访问被拒绝
  14. Python爬取拉钩招聘网,告诉你:这类程序员最赚钱!
  15. 纯干货分享,2021年阿里巴巴社招面试题总结,本人上周已成功入职!
  16. pdf太大了不能上传怎么办?
  17. JETT(五)-支持Excel公式
  18. python爬虫中遇到“\xb5”、“xa0”等字符时报错编码错误的处理方式
  19. 使用Python将微信和支付宝账单导入随手记
  20. Android实现资源动态加载的两种方式

热门文章

  1. 打不开_笔记本电脑摄像头打不开怎么办
  2. oracle bucket trace,Frequent generate a lot of cdmp* directories contain *bucket trace in bdump
  3. mysql in语句 索引,MySQL 中索引相关 SQL 语句
  4. keil中如何查看代码大小
  5. nand flash驱动编写步骤
  6. 机器学习 集成学习理论基础 随机森林+adaboost
  7. 又一次Java线程卡死的调试经历
  8. 用Java搭建一套访问redis的API
  9. QTableView双击 单机事件信号
  10. PHP学习8——图像处理