在局部网内用UDP通过代理服务器连接外面的人,怎么样用VC写通过代理呢?

caimouse
人工智能领域优质创作者
博客专家认证
2001-09-24 06:17:41
在局部网内用UDP通过代理服务器连接外面的人,怎么样用VC写通过代理呢?
比如说有A,P,C三台机,
要让A和C连接,用UDP啊。
P是代理。
A->P->C.
有源程序吗?
...全文
426 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgc_7622 2002-02-05
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topicview1.asp
来吧,来吧!


































ygangy 2002-01-31
  • 打赏
  • 举报
回复
g z g z
caimouse 2002-01-23
  • 打赏
  • 举报
回复
真的不行吗
caimouse 2002-01-23
  • 打赏
  • 举报
回复
先帮我看看吧,
我已经能发出去了,但是收不到代理给我的数据.?
cyy1118 2002-01-23
  • 打赏
  • 举报
回复
http://www.csdn.net/Expert/topic/493/493600.shtm
帮忙看看
howard 2002-01-23
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/491/491928.shtm

各位,帮我看看怎么做?
caimouse 2002-01-23
  • 打赏
  • 举报
回复
有人知道吗?
caimouse 2002-01-22
  • 打赏
  • 举报
回复
为什么我的也不行呢?
同样的.
CString strProxy("10.0.0.103");
UINT nProxyPort = 1080;
CString strUserName("caijs");
CString strPassword("caijs");

struct sockaddr_in proxy_addr;
proxy_addr.sin_family = AF_INET;
proxy_addr.sin_addr.s_addr = 0;
proxy_addr.sin_port = 0;


CProxy proxy;
CTCPSocket* pSockProxy = new CTCPSocket();
pSockProxy->Create();
//Socks5认证
proxy.TCPProxyReqAuth5(
pSockProxy,
strProxy,
nProxyPort,
strUserName,
strPassword
);
//
proxy.Socks5Udp(pSockProxy,proxy_addr);

//
struct sockaddr_in remote_address;// 主机地址.
remote_address.sin_family = AF_INET;
remote_address.sin_addr.s_addr = inet_addr("10.0.0.103");;
remote_address.sin_port = proxy_addr.sin_port;//htons(6779);

char buf[20];
buf[0] = 0;
buf[1] = 0;
buf[2] = 0;//不分片为0,分片为1。
buf[3] = 1;//IPV4为1。
memcpy(&buf[4],&remote_address.sin_addr.s_addr,4);
memcpy(&buf[8],&remote_address.sin_port,2);
memcpy(&buf[10],"abcd",5);

SOCKET sUdp = socket(AF_INET, SOCK_DGRAM, 0);
bind(sUdp,(struct sockaddr FAR *)&remote_address,sizeof(remote_address));
//
int iRet = sendto(sUdp,buf,15,0,(sockaddr*)&proxy_addr,sizeof(proxy_addr));
memset(buf,0,20);
int addrLen = sizeof(remote_address);
iRet = recvfrom(sUdp,buf,15,0,(sockaddr*)&remote_address,&addrLen);
//在这不行了.
//
closesocket(sUdp);
delete pSockProxy;
cdone 2001-11-08
  • 打赏
  • 举报
回复
现在本机bind的端口能收到了,发射的时候也发出去了,我单步跟踪的时候

recvfrom()中的 sockaddr 参数中填的数据也是代理的 ip,现在问题是

发射的内容,客户端却收不到。好像代理把我反射回的报丢弃了。

服务器段:

result = recvfrom(udp_sockfd,buffer,1000,0,(struct sockaddr*)&sourAddr,&len);
buffer[result] = '\n';
result = sendto(udp_sockfd,buffer,result,0,(struct sockaddr*)&sourAddr,len);


客户端:

int result = 0;
struct sockaddr_in sourAddr;
int len = sizeof(sourAddr);
result = recvfrom(udp_sockfd,buffer,MAX_BUFFER,0,(sockaddr*)&sourAddr,&len); //阻塞在此处!!!!!!!!!!!!!!!!!


哪位大侠快出手!!

舟中夜起 2001-11-07
  • 打赏
  • 举报
回复
5返回了服务器地址和分配的端口了吗?还有目标IP和端口是真实的吗?还是也在代理后边

没问题的,这段程序我一直在用
舟中夜起 2001-11-07
  • 打赏
  • 举报
回复
远程接收到本地发送的数据了吗?是否往回发送了数据,地址是否正确,和5返回的地址端口比较。

我没有发现你程序有什么问题
cdone 2001-11-07
  • 打赏
  • 举报
回复
5返回了代理的ip和分配的端口;

我是这样的:

我通过我们局域网的代理(肯定是好用的)连接我自己的机器,当代理tcp 请求时,已经

测试通过了;可是udp却总是阻塞在recefrom();(我在本地bind了一个端口):

程序如下:

发送请求之前先绑定本地端口:

// bind the local port
struct sockaddr_in localAddr;
int len = sizeof(sockaddr);
memset(&localAddr,0,len);
localAddr.sin_family = AF_INET;

localAddr.sin_addr.s_addr = inet_addr("0.0.0.0");
localAddr.sin_port = htons(localPort);

udp_sockfd = socket(AF_INET,SOCK_DGRAM,0);
if (udp_sockfd == -1)
{
AfxMessageBox("SOCKET INITISLIZE ERROR!");
return FALSE;
}

result = bind(udp_sockfd,(sockaddr*)&localAddr,len);
if (result == -1)
{
closesocket(udp_sockfd);
AfxMessageBox(_T("绑定本地端口失败!"));
return FALSE;
}

发送请求接受代理的 REP

result = send(tcp_sockfd,buffer,10,0);
result = recv(tcp_sockfd,buffer,MAX_BUFFER,0);
closesocket(tcp_sockfd);

if ( (buffer[0] != 5) || (buffer[1] != 0) )
return FALSE;

memcpy(&Bndip,buffer+4,4);
int pp;
memcpy(&BndPort,buffer+8,2);
pp = ntohs(BndPort);
BndPort = pp;
tcp_Close();
(注: 此时返回了代理在局域网段的网址以及分配的一个端口)


发送数据报:
//DATAGRAM HEADER

buffer[0]=0x00;
buffer[1]=0x00;
buffer[2]=0x00; //FRAG this datagram is alone
buffer[3]=0x01; // ipv4

memcpy(&buffer+4,&ip,4); //目标ip
memcpy(buffer+8,&port,2) ; //目的端口,均为网络字节顺序
memcpy(buffer+10,buff,len);

struct sockaddr_in proxyAddr;
int socklen = sizeof(sockaddr);
memset(&proxyAddr,0,socklen);
proxyAddr.sin_family = AF_INET;

proxyAddr.sin_addr.s_addr = Bndip;
proxyAddr.sin_port = htons(BndPort);


result = sendto(udp_sockfd,buffer,len+10,0,(struct sockaddr*)&proxyAddr,socklen);
return result;

接受数据报:
int result = 0;
struct sockaddr_in sourAddr;
int len = sizeof(sockaddr);
memset(&sourAddr,0,len);
sourAddr.sin_family = AF_INET;
sourAddr.sin_addr.s_addr = inet_addr("0.0.0.0");
sourAddr.sin_port = htons(localPort);
result = recvfrom(udp_sockfd,buffer,MAX_BUFFER,0,(sockaddr*)&sourAddr,&len); // (总是阻塞在这儿!)
return result;



谢谢 Kronus(Kronus)!
cdone 2001-11-07
  • 打赏
  • 举报
回复
我在本机 bind 一个udp 端口,结果还真的 收不到代理转发的 数据报?

(但是tcp可以)

Kronus(Kronus)你觉得可能的原因是什么?

能不能把你的代码给我参考一下:)
cnss 2001-11-06
  • 打赏
  • 举报
回复
听课
舟中夜起 2001-11-06
  • 打赏
  • 举报
回复
5返回的地址和端口就是和服务器通讯用的,以后所有的数据都发向这个地址和端口,格式如7。
cdone 2001-11-06
  • 打赏
  • 举报
回复
为什么总是收不到呢?
cdone 2001-11-05
  • 打赏
  • 举报
回复
Kronus(Kronus) 请问:

第5步中, 服务器返回的 服务器地址和端口 (BND.ADDRESS 和 BND.PORT)

是干什么用的?

第7步中的 目的地址和目的端口是不是就是上面的两个端口?

rfc1928 中说:返回的该 BND.ADDRESS 可能是 proxy的其他网段的地址。
(因为proxy一般是多宿的,绑定了多个IP)
cdone 2001-10-24
  • 打赏
  • 举报
回复
我看了一下rfc1928文档, 客户端的请求命令有三种:

connect
ychener 2001-10-23
  • 打赏
  • 举报
回复
是不是标准代理?如果是标准代理需要知道具体的代理协议

如果是自己写代理协议,应该比较简单,

主要是通过端口转换,和代理服务器建立代理端口上的连接,将请求包再度封装,主要是加上请求目标地址的IP和Port以及内容,在通过代理发送到目标地址,好了!
cdone 2001-10-23
  • 打赏
  • 举报
回复
如果我想 bind 一个端口,进行监听,怎么办?
加载更多回复(8)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧