基于消息的异步套接字

首先加载套接字库

#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);

posted @ 2010-06-05 18:05  zhouli  阅读(648)  评论(0编辑  收藏  举报