绑定窗口的异步套接字编程
2015-04-09 22:16
288 查看
test1.h
test1.cpp
main.cpp
public: SOCKET m_socket; //初始化网络 bool OnInitSocket(void); //发送消息 bool OnSendSocket(void);
test1.cpp
bool CTest1::OnInitSocket( void ) { WSADATA wsadata; WSAStartup(MAKEWORD(2,2),&wsadata); m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,0,0,0); if(INVALID_SOCKET==m_socket) { MessageBox(win.hwnd,TEXT("创建套接字失败"),NULL,MB_OK); return FALSE; } SOCKADDR_IN sockaddr; sockaddr.sin_family=AF_INET; sockaddr.sin_port=htons(6000); sockaddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); if (bind(m_socket,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR))==SOCKET_ERROR) { MessageBox(win.hwnd,TEXT("绑定失败"),NULL,MB_OK); return FALSE; } if (WSAAsyncSelect(m_socket,win.hwnd,WM_SOCKMSG,FD_READ|FD_WRITE|FD_ACCEPT|FD_CONNECT|FD_CLOSE)==SOCKET_ERROR) { MessageBox(win.hwnd,TEXT("网络事件注册失败"),NULL,MB_OK); return FALSE; } return TRUE; } bool CTest1::OnSendSocket( void ) { TCHAR szTemp[32]={0}; tstring strHostName; DWORD dwIP; hostent *phostname; SOCKADDR_IN sockaddr; sockaddr.sin_family=AF_INET; sockaddr.sin_port=htons(6000); if (GetDlgItemText(win.hwnd,IDC_EDIT3,szTemp,sizeof(szTemp))==NULL) { //((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SendMessage(GetDlgItem(win.hwnd,IDC_IPADDRESS1),IPM_GETADDRESS,0,(LPARAM)&dwIP); sockaddr.sin_addr.S_un.S_addr=htonl(dwIP); } else { phostname=gethostbyname(szTemp); sockaddr.sin_addr.S_un.S_addr=*((DWORD*)phostname->h_addr_list[0]); } TCHAR szSendBuf[128]={0}; GetDlgItemText(win.hwnd,IDC_EDIT2,szSendBuf,sizeof(szSendBuf)); int nlen=_tcslen(szSendBuf); SetDlgItemText(win.hwnd,IDC_EDIT2,TEXT("")); DWORD dwSend; WSABUF wsabuf={0}; wsabuf.buf=new char[nlen]; memcpy(wsabuf.buf,szSendBuf,nlen); wsabuf.len=nlen; if (WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR),NULL,NULL)==SOCKET_ERROR ) { MessageBox(win.hwnd,TEXT("数据发送失败"),NULL,MB_OK); return FALSE; } return TRUE; }
main.cpp
case WM_SOCKMSG: { switch(LOWORD(lParam)) { case FD_READ: { WSABUF wsabuff; wsabuff.buf=new char[200]; wsabuff.len=200; ZeroMemory(wsabuff.buf,200); DWORD dwRead; DWORD dwFlag=0; SOCKADDR_IN sockaddr; int nlen=sizeof(SOCKADDR); if (WSARecvFrom(CTest1::GetInstance()->m_socket,&wsabuff,1,&dwRead,&dwFlag,(SOCKADDR*)&sockaddr,&nlen,NULL,NULL)==SOCKET_ERROR) { MessageBox(win.hwnd,TEXT("接收数据失败"),NULL,MB_OK); return false; } HOSTENT *pHost=gethostbyaddr((char*)&sockaddr.sin_addr.S_un.S_addr,4,AF_INET); TCHAR szText[256]={0},szTemp[128]={0}; _sntprintf_s(szText,sizeof(szText),TEXT("%s说:%s\r\n"),pHost->h_name,wsabuff.buf); GetDlgItemText(win.hwnd,IDC_EDIT1,szTemp,sizeof(szTemp)); _tcscat(szText,szTemp); SetDlgItemText(win.hwnd,IDC_EDIT1,szText); delete []wsabuff.buf; } break; case FD_WRITE: break; case FD_CLOSE: break; case FD_ACCEPT: break; case FD_CONNECT: break; } } break;
相关文章推荐
- 线程同步与异步套接字编程小结
- 一个全手工绑定的异步回调公共搜索窗口
- 孙鑫MFC笔记之十四--多线程同步与异步套接字编程
- 异步套接字编程之WSAAsyncSelect模型
- 异步套接字编程之select模型
- 孙鑫 第十五/十六课之六 基于消息异步UDP套接字编程实例
- 孙鑫教学视频笔记 (16)线程同步与异步套接字编程
- 网络编程——基于消息的异步套接字编程
- VC中TCP实现 异步套接字编程的原理+代码
- 异步套接字编程之WSAEventSelect
- 孙鑫教学视频笔记 (16)线程同步与异步套接字编程
- 线程同步与异步套接字编程
- 孙鑫MFC笔记教程(16)--线程同步和异步套接字编程
- 《VC++深入详解》学习笔记[13]——第16章 线程同步与异步套接字编程
- 线程同步与异步套接字编程
- INTERNET编程之异步套接字
- TCP/IP协议的套接字类型及异步winsock编程例子
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 套接字选项的使用 (心跳检测、绑定地址复用)
- 孙鑫 第十五/十六课之五 基于消息异步套接字编程
- 异步套接字编程之CompletionPort