如何在WINDOWS环境下实现原始UDP数据包发送..请高手解答,送分

如题所述

我有个VC++语言的Socket程序不过IP协议是6的,给你看2个关键函数
void CMy6dDlg::OnButton1() //建发送SOCKET
{
memset(&hints,0,sizeof(hints));
//hints.ai_family=PF_UNSPEC;
hints.ai_family=AF_INET6;
hints.ai_socktype=SOCK_DGRAM;
hints.ai_protocol=IPPROTO_UDP;
hints.ai_flags=AI_NUMERICHOST;
rc=getaddrinfo((LPCTSTR )m_send,"2000",&hints,&res);//解析本机发地址
if(rc!=0)
{
AfxMessageBox("fail");
return;
}
s_send=socket(res->ai_family,res->ai_socktype,res->ai_protocol);//建本机发地址
if(s_send==INVALID_SOCKET)
{AfxMessageBox("建本机发socket失败");return ;}
else
{
AfxMessageBox("建本机发socket成功");
//绑定本地监听端口bind
if(bind (s_send,res->ai_addr,res->ai_addrlen)==SOCKET_ERROR)
//fprintf(stderr,"bind() failed with error %d: %s\
",WSAGetLastError(), DecodeError(WSAGetLastError()));
AfxMessageBox("bind失败");
else
{

AfxMessageBox("bind成功");

GetDlgItem(IDOK)->EnableWindow (TRUE);
}
//printf("bind ok\
");
}

if ( WSAAsyncSelect( s_send, m_hWnd, UM_PACKET, FD_READ ) == SOCKET_ERROR )
{
MessageBox( "WSAAsyncSelect failed" );
closesocket( s_send );
return;
}

}
void CMy6dDlg::OnOK()
{
// TODO: Add extra validation here
//发送消息
UpdateData(TRUE);
memset(&hints,0,sizeof(hints));
//hints.ai_family=PF_UNSPEC;
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)
{
//fprintf(stderr, "send() failed: error %d: %s\
",WSAGetLastError(), DecodeError(WSAGetLastError()));
AfxMessageBox("发送失败");
closesocket(s_send);
}
else
{
AfxMessageBox("发送成功");

}

}
具体的你可以参考Socket
温馨提示:答案为网友推荐,仅供参考
相似回答