实例解析IPv6下的VC网络编程2(3)
3.发送 memset(&hints,0,sizeof(hints));
hints.ai_family=AF_INET6;
hints.ai_socktype=SOCK_DGRAM;
hints.ai_protocol=IPPROTO_UDP;//这里也可以改为0,让系统自己选
hints.ai_flags=AI_NUMERICHOST;
rc=getaddrinfo((LPCTSTR )m_receive,"2000",&hints,&res);//解析对方收地址
if(rc!=0)
{
AfxMessageBox("fail");
return;
}
rc=sendto(s_send,m_sendtxt,m_sendtxt.GetLength(),0,
res->ai_addr,res->ai_addrlen);
if (rc== SOCKET_ERROR)
{
AfxMessageBox("发送失败");
closesocket(s_send);
}
else
{
AfxMessageBox("发送成功");
}
4.异步触发事件 LRESULT CMy6dDlg::OnPacket( WPARAM wParam, LPARAM lParam )
{
char sBuf[128];
sockaddr_in6 sa;
int iAddrLen=sizeof( sa );
int a=sizeof(sockaddr);
ZeroMemory( &sa, sizeof( sa ) );
memset(&sBuf,0,sizeof(sBuf));
int iLen = recv(s_send, sBuf, sizeof(sBuf),0);//for win2k use recv
if(iLen<0)
{
fprintf(stderr,"recvfrom failed with error %d: %s
",)WSAGetLastError(), DecodeError(WSAGetLastError()));
return 0;
}
else
{
sBuf[iLen] = 0;
CString sText;
char lpszAddressString[1000];
DWORD dwAddressStringLength=1000;
rc=WSAAddressToString((sockaddr*)&sa,sizeof(sa),NULL,
lpszAddressString,&dwAddressStringLength );
sText.Format( "recved [%s]", sBuf);//,sa.sin6_family==AF_INET6,
lpszAddressString);//for win2k
m_reclist.AddString( sText );
return 0;
}
}