socket连代理服务器 用socket连接代理服务器时,用户名和密码应该怎么样传给代理呢?而且我想要下载的页面怎么通过代理传过来呢?是不是我只管向代理发请求,代理自动把我要的页面传过来 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那密码和用户名怎么发给代理服务器阿?HTTP协议里有定义发送用户名和密码马? 使用recv函数发送int recv( SOCKET s, char* buf, int len, int flags);把用户名和密码放到buf中就是,不过你应当了解服务器的接收格式,来决定是把密码和用户名一块发过去,还是分开发! 连到代理服务器时会有一个验证,需要输入用户名和密码是不是说明是Socks5的代理服务器?是要用tcp连还是用udp连呢? //C源代码:客户端怎样通过proxy进行连接,支持https, socks5代理//base64编码static void to64frombits(unsigned char *out, const unsigned char *in, int inlen){const char base64digits[] ="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for (; inlen >= 3; inlen -= 3){*out++ = base64digits[in[0] >> 2];*out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];*out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];*out++ = base64digits[in[2] & 0x3f];in += 3;}if (inlen > 0){unsigned char fragment;*out++ = base64digits[in[0] >> 2];fragment = (in[0] << 4) & 0x30;if (inlen > 1)fragment |= in[1] >> 4;*out++ = base64digits[fragment];*out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];*out++ = '=';}*out = '\0';};//-- connect proxyBOOL ConnectEx(SOCKET sock, const char *lpszDestHost, int nDestPort, const char * lpszProxyAddress, const int nProxyPort, const char * lpszProxyProtocol, BOOL bNeedAuth, const char * lpszUserName, const char * lpszPassword){//connect to proxychar szBuffer[1024 + 1] = {""};int nLen = 0;SOCKADDR_IN saProxy;saProxy.sin_family = AF_INET;saProxy.sin_port = nProxyPort;saProxy.sin_addr.S_un.S_addr= inet_addr(lpszProxyAddress);if (saProxy.sin_addr.S_un.S_addr == INADDR_NONE){LPHOSTENT lphost;lphost = gethostbyname(lpszProxyAddress);if (lphost != NULL)saProxy.sin_addr.S_un.S_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;else{return 0;}} if(connect(sock, (SOCKADDR*)&saProxy, sizeof(SOCKADDR))){return 0;}if(stricmp(lpszProxyProtocol, "HTTPS") == 0 || stricmp(lpszProxyProtocol, "HTTP") == 0 ){if(bNeedAuth){//Proxy-Authorization: Basic char szAuth[1024 + 1] = {""};char szAuthT[1024 + 1] = {""};sprintf(szAuthT, "%s:%s", lpszUserName,lpszPassword);to64frombits((UCHAR *)szAuth, (UCHAR *)szAuthT, strlen(szAuthT));sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: Basic %s\r\n\r\n", lpszDestHost, nDestPort, szAuth);}else{sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\n\r\n", lpszDestHost, nDestPort);}nLen = strlen(szBuffer);send(sock, szBuffer, nLen, 0);nLen = 1024;recv(sock, szBuffer, nLen, 0);if(strnicmp(szBuffer, "HTTP/1.0 200", strlen("HTTP/1.0 200")) == 0 || strnicmp(szBuffer, "HTTP/1.1 200", strlen("HTTP/1.1 200")) == 0){return 1;}return 0;}if(stricmp(lpszProxyProtocol, "SOCKS5") == 0){//authnLen = 0;if(bNeedAuth){szBuffer[0] = 5;szBuffer[1] = 2;szBuffer[2] = 0;szBuffer[3] = 2;nLen = 4;send(sock, szBuffer, nLen, 0);nLen = 2;recv(sock, szBuffer, nLen, 0);if(szBuffer[0] == 5){//need authif(szBuffer[1] == 2){szBuffer[0] = 1;nLen = strlen(lpszUserName);szBuffer[1] = nLen;strcpy(szBuffer+2, lpszUserName);nLen += 2;szBuffer[nLen] = strlen(lpszPassword);strcpy(szBuffer+nLen+1, lpszPassword);nLen = nLen + 1 + strlen(lpszPassword);send(sock, szBuffer, nLen, 0);nLen = 2;recv(sock, szBuffer, nLen, 0);if(szBuffer[1] != 0){return 0;}}else{if(szBuffer[1] != 0){return 0;}}}elsereturn 0;}else{szBuffer[0] = 5;szBuffer[1] = 1;szBuffer[2] = 0;nLen = 3;send(sock, szBuffer, nLen, 0);nLen = 2;recv(sock, szBuffer, nLen, 0);if(szBuffer[0] != 5 || szBuffer[1] != 0){return 0;}}//translate DestAddrszBuffer[0] = 5;szBuffer[1] = 1;szBuffer[2] = 0;szBuffer[3] = 3;//DOMAINszBuffer[4] = strlen(lpszDestHost);//domain lenstrcpy(szBuffer+5, lpszDestHost);unsigned short uPort = htons(nDestPort);memcpy(szBuffer+5+strlen(lpszDestHost), &uPort, 2);nLen = 5 + strlen(lpszDestHost) + 2;send(sock, szBuffer, nLen, 0);nLen = 10;recv(sock, szBuffer, nLen, 0);if(szBuffer[0] != 5 || szBuffer[1] != 0){return 0;}return 1;}return 0;} 有谁知道类似这种列表框的东西怎么做出来的吗? 这种写法怎么理解? 想把获得的数据用图形显示出来,而把数据的最大和最小值打印出来,用SDI还是MDI? 很奇怪的问题,大人明示 怎样在一个区域内显示众多缩小比例的图片,该区域能带滚动条? 如何查找内存泄漏? 几个问题,大家都来看看,帮个忙! 服务器的端口 Visual studio .NET 如何安装? 用ID3DXFont的DrawText计算空格符的宽度,结果为什么是0 好了,要开始找工作了. 为什么MFC一些基类的的函数内容看不见,只看到声明!
int recv(
SOCKET s,
char* buf,
int len,
int flags
);把用户名和密码放到buf中就是,不过你应当了解服务器的接收格式,来决定是把密码和用户名一块发过去,还是分开发!
是不是说明是Socks5的代理服务器?是要用tcp连还是用udp连呢?
//base64编码
static void to64frombits(unsigned char *out, const unsigned char *in, int inlen)
{
const char base64digits[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
for (; inlen >= 3; inlen -= 3)
{
*out++ = base64digits[in[0] >> 2];
*out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
*out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
*out++ = base64digits[in[2] & 0x3f];
in += 3;
}
if (inlen > 0)
{
unsigned char fragment;*out++ = base64digits[in[0] >> 2];
fragment = (in[0] << 4) & 0x30;
if (inlen > 1)
fragment |= in[1] >> 4;
*out++ = base64digits[fragment];
*out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
*out++ = '=';
}
*out = '\0';
};//-- connect proxy
BOOL ConnectEx(SOCKET sock, const char *lpszDestHost, int nDestPort, const char * lpszProxyAddress, const int nProxyPort, const char * lpszProxyProtocol, BOOL bNeedAuth, const char * lpszUserName, const char * lpszPassword)
{
//connect to proxy
char szBuffer[1024 + 1] = {""};
int nLen = 0;SOCKADDR_IN saProxy;
saProxy.sin_family = AF_INET;
saProxy.sin_port = nProxyPort;
saProxy.sin_addr.S_un.S_addr= inet_addr(lpszProxyAddress);
if (saProxy.sin_addr.S_un.S_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszProxyAddress);
if (lphost != NULL)
saProxy.sin_addr.S_un.S_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
return 0;
}
} if(connect(sock, (SOCKADDR*)&saProxy, sizeof(SOCKADDR)))
{
return 0;
}if(stricmp(lpszProxyProtocol, "HTTPS") == 0 || stricmp(lpszProxyProtocol, "HTTP") == 0 )
{
if(bNeedAuth)
{
//Proxy-Authorization: Basic
char szAuth[1024 + 1] = {""};
char szAuthT[1024 + 1] = {""};
sprintf(szAuthT, "%s:%s", lpszUserName,lpszPassword);
to64frombits((UCHAR *)szAuth, (UCHAR *)szAuthT, strlen(szAuthT));
sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\nProxy-Authorization: Basic %s\r\n\r\n", lpszDestHost, nDestPort, szAuth);
}
else
{
sprintf(szBuffer, "CONNECT %s:%d HTTP/1.0\r\n\r\n", lpszDestHost, nDestPort);
}nLen = strlen(szBuffer);
send(sock, szBuffer, nLen, 0);
nLen = 1024;
recv(sock, szBuffer, nLen, 0);
if(strnicmp(szBuffer, "HTTP/1.0 200", strlen("HTTP/1.0 200")) == 0 ||
strnicmp(szBuffer, "HTTP/1.1 200", strlen("HTTP/1.1 200")) == 0)
{
return 1;
}
return 0;
}if(stricmp(lpszProxyProtocol, "SOCKS5") == 0)
{
//auth
nLen = 0;
if(bNeedAuth)
{
szBuffer[0] = 5;
szBuffer[1] = 2;
szBuffer[2] = 0;
szBuffer[3] = 2;
nLen = 4;
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] == 5)
{
//need auth
if(szBuffer[1] == 2)
{
szBuffer[0] = 1;
nLen = strlen(lpszUserName);
szBuffer[1] = nLen;
strcpy(szBuffer+2, lpszUserName);
nLen += 2;
szBuffer[nLen] = strlen(lpszPassword);
strcpy(szBuffer+nLen+1, lpszPassword);
nLen = nLen + 1 + strlen(lpszPassword);
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[1] != 0)
{
return 0;
}
}
else
{
if(szBuffer[1] != 0)
{
return 0;
}
}
}
else
return 0;}
else
{
szBuffer[0] = 5;
szBuffer[1] = 1;
szBuffer[2] = 0;
nLen = 3;
send(sock, szBuffer, nLen, 0);
nLen = 2;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] != 5 || szBuffer[1] != 0)
{
return 0;
}
}
//translate DestAddr
szBuffer[0] = 5;
szBuffer[1] = 1;
szBuffer[2] = 0;
szBuffer[3] = 3;//DOMAIN
szBuffer[4] = strlen(lpszDestHost);//domain len
strcpy(szBuffer+5, lpszDestHost);
unsigned short uPort = htons(nDestPort);
memcpy(szBuffer+5+strlen(lpszDestHost), &uPort, 2);
nLen = 5 + strlen(lpszDestHost) + 2;
send(sock, szBuffer, nLen, 0);
nLen = 10;
recv(sock, szBuffer, nLen, 0);
if(szBuffer[0] != 5 || szBuffer[1] != 0)
{
return 0;
}
return 1;
}
return 0;
}