向代理服务器发送UDP请求之后,如何编写代码发送UDP数据包,在线等.谢谢!!!
解决方案 »
- 在win7下怎么实现一个放大镜功能
- 如何让windows程序突破2GB内存的使用限制?
- DEBUG时出现:there is no source code available for the current location
- 求16位的TIF格式,在线等
- 转发 ORACLE 数据库版块 100分的链接
- ××××××××××外行来这里请教一个问题××××××××××
- vs2010编写多点触控程序-图片浏览
- 请教高手:跨进程传输 字符串 失败。
- 如何从内存中截取将要从屏幕上显示的文字信息,然后将其替换成为其它信息在屏幕上输出??
- 怎样检测联网状态?
- 我用一根串口线将两台机子的1口接起来/然后在两台机子(1口均已打开)上同时运行Comdebug并发送消息/但两边都收不到对方的消息/是不是线有
- 这个该如何操作。。。
与代理服务器协商UDP association请求时,其中DST.ADDR和DST.PORT是本地的吗?
请您检查下面的程序,看哪里有错? 大家都可以帮忙查下.谢谢!!!
void CProxyClientDlg::OnConnect()
{
GetDlgItemText(IDC_PROXYADDR,m_ProxyAddr);
GetDlgItemText(IDC_PROXYPORT,m_ProxyPort);
if(m_ProxyAddr.IsEmpty () || m_ProxyPort.IsEmpty ())
{
AfxMessageBox("代理服务器地址框和端口框不能为空,请输入相应的数据!");
return;
} GetDlgItemText(IDC_DESTADDR,m_DestAddr);
if(m_DestAddr.IsEmpty ())
{
AfxMessageBox("目标服务器地址框不能为空,请输入IP数据!");
return;
}
//连接代理服务器
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
AfxMessageBox("Can't Initialize Windows Socket Dll!");
WSACleanup();
return;
}
ServerSocket=socket(AF_INET,SOCK_STREAM,0);//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if(ServerSocket == INVALID_SOCKET)
{
AfxMessageBox("Create Socket Fail!");
return;
} GetDlgItem(IDC_PROXYPORT)->GetWindowText(m_ProxyPort);
ProxyAddress.sin_family =AF_INET;
ProxyAddress.sin_port =htons(atoi(m_ProxyPort));
in_addr address;
address=GetIpByDestHost(m_ProxyAddr.GetBuffer(0));
ProxyAddress.sin_addr=address; if(connect(ServerSocket,(LPSOCKADDR)&ProxyAddress,sizeof(ProxyAddress)) == SOCKET_ERROR)
{
list.InsertString(0,"无法代理连接服务器。");
return;
} list.InsertString(0,"连接代理服务器成功!");//连接后客户端发送一个版本标识/方法选择的TCP报文需求给代理服务器
m_ClientReq1=(Socks5Req1*)buffer;
m_ClientReq1->Ver=0x05;
m_ClientReq1->nMethods=01;
m_ClientReq1->Methods[0]=0x00;
int ret=send(ServerSocket,buffer,3,0);
if(ret==SOCKET_ERROR)
{
AfxMessageBox("Firstly Send Client Requirement Fail!");
closesocket(ServerSocket);
return;
} if(recv(ServerSocket,buffer,sizeof(buffer),0) == SOCKET_ERROR)
list.InsertString(0,"接收数据发生错误!");
//代理服务器接收客户端的请求后,根据自身系统的实现返回并告诉客户端采用哪种方法验证
//即接收代理服务器的应答 m_ProxyAns1=(Socks5Ans1*)buffer; if(m_ProxyAns1->Ver==0x05 && m_ProxyAns1->Method==0xFF)
{
list.InsertString (0,"代理服务器没有可接受的方法。");
closesocket(ServerSocket);
return;
} UdpSocket=socket(AF_INET,SOCK_DGRAM,0);
if(UdpSocket==SOCKET_ERROR)
{
list.InsertString (0,"创建UDP SOCKET失败!");
return;
} m_ClientReq2 = (Socks5Req2 *)buffer;
m_ClientReq2->Ver=0x05;
m_ClientReq2->Cmd=0x03;
m_ClientReq2->Rsv=0x00;
m_ClientReq2->Atyp=0x01;
m_ClientReq2->LocalAddr.s_addr=inet_addr(GetLocalIpByName());
m_ClientReq2->LocalPort=htons(UdpSocket); ret=send(ServerSocket,buffer,sizeof(buffer),0);
if(ret==SOCKET_ERROR)
{
AfxMessageBox("Secondly Send Client Requirement Fail!");
closesocket(ServerSocket);
return;
}
if(recv(ServerSocket,buffer,sizeof(buffer),0) == SOCKET_ERROR)
list.InsertString(0,"接收数据发生错误!");
m_ProxyAns2=(Socks5Ans2*)buffer; if(m_ProxyAns2->Rep!=0x00)
{
list.InsertString (0,"发送UDP请求失败!");
closesocket(ServerSocket);
return;
} BndAddress.sin_family =AF_INET;
BndAddress.sin_port =m_ProxyAns2->SerbndPort;
BndAddress.sin_addr=m_ProxyAns2->SerbndAddr; list.InsertString(0,"发送UDP请求成功!");}void CProxyClientDlg::OnSend()
{
GetDlgItemText(IDC_EDIT_MESSAGE,str);
if(str.IsEmpty())
{
list.InsertString(0,"发送的字符串不能为空。");
return;
}
m_ClientUdp=(UdpheadInfo*)buffer;
m_ClientUdp->Rsv=0x00;
m_ClientUdp->Flag=0x00;
m_ClientUdp->Atyp=0x01; char *DestHAddr=m_DestAddr.GetBuffer(0);
in_addr Destaddress=GetIpByDestHost(DestHAddr);
CopyMemory(&m_ClientUdp->DestAddr,&Destaddress,4); GetDlgItemText(IDC_DESTPORT,m_DestPort);
m_ClientUdp->DestPort=htons((short)atoi(m_DestPort.GetBuffer(0)));
strcpy(m_ClientUdp->Data,(LPCTSTR)str); if(sendto(UdpSocket,buffer,sizeof(buffer),0,(LPSOCKADDR)&BndAddress,sizeof(BndAddress)) == SOCKET_ERROR)// recv(ServerSocket,buf,sizeof(buf),0);
{
list.InsertString(0,"发送数据发生错误。");
}
else
list.InsertString(0,"客户端信息: "+str);
int len=sizeof(BndAddress);
if(recvfrom(UdpSocket,buffer,sizeof(buffer),0,(LPSOCKADDR)&BndAddress,&len) == SOCKET_ERROR)
{
list.InsertString(0,"接收数据发生错误!");
return;
}
m_ClientUdp=(UdpheadInfo*)buffer;
str.Format("%s",m_ClientUdp->Data);
list.InsertString(0,"服务端信息: "+str);
list.InsertString (0,"UDP数据包发送成功!");
str.Empty();
UpdateData(FALSE);
((CEdit *)GetDlgItem(IDC_EDIT_MESSAGE))->SetActiveWindow();
}
m_ClientReq2->LocalPort=htons(UdpSocket);本地绑定端口怎么是套接字句柄?
至于UDP穿透SOCKS5代理编程这个文章,我看过,可是还不太懂.请赐教!