您的位置:首页 > 编程语言

绑定窗口的异步套接字编程

2015-04-09 22:16 288 查看
test1.h

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: