网上已经有很多文档详细介绍了协议内容以及怎么去使用,最近在做这个项目,已经完成了TCP协议的全部部分,在这里做下笔记顺便和大家分享下,如果有需要的同志们可以用我这个作为模板,已经精通这些的大神们希望看到问题能给我提出来,我也有几个地方是一知半解,其中有些我遇到的注意事项我会单独注明,防止自己后再犯同样的错误。。。
下面是协议第一部分代码(注意,和代理服务器的连接在这一部分已经完成,这里只贴出了关于通信协议的主要代码,C++中怎么样和代理服务器进行连接如果不了解的话,可以参考我的另一篇博客:https://blog.csdn.net/hu421160052/article/details/87262226)
int index = 0;
byte Msg1[100];
//socks5协议部分(1.发送数据至服务器)
//|--------|-------------|-------------|
//| VER | NMETHOD | METHODS |
//|--------|-------------|-------------|
//| 1 | 1 | 1-255 |
//|--------|-------------|-------------|
// VER是SOCKS版本,这里应该是0x05.
// NMETHODS是METHODS部分的长度.
// METHODS是客户端支持的认证方式列表,每个方法占1字节。当前的定义是:
// 0x00 不需要认证
// 0x01 GSSAPI
// 0x02 用户名、密码认证
// 0x03 - 0x7F由IANA分配(保留)
// 0x80 - 0xFE为私人方法保留
// 0xFF 无可接受的方法
Msg1[index++] = 0x05; //Version 版本号
Msg1[index++] = 0x01; //Method 方法
Msg1[index++] = 0x02; //Username/Password 认证用户名/认证密码
//第一次发送数据
send(sockClient, (const char*)Msg1, index, 0);
char Send_Msg[100];
sprintf(Send_Msg, "VER:0x%d%d\r\n METHOD:0x%d%d\r\n Method:0x%d%d\r\n", (Msg1[0] / 16),(Msg1[0] % 16), (Msg1[1] / 16), (Msg1[1] % 16), (Msg1[2] / 16), (Msg1[2] % 16));
MessageBoxA(NULL, (const char*)Send_Msg, "发送数据:", NULL);
byte RecvMsg1[10];
numl=recv(sockClient, (char*)RecvMsg1, sizeof((const char*)RecvMsg1), 0);
int q00 = (RecvMsg1[0] / 16),q01= (RecvMsg1[0] % 16);
int q10 = (RecvMsg1[1] / 16), q11 = (RecvMsg1[1] % 16);
char result[1024];
//socks5协议部分(2.服务器响应数据)
//|--------|-------------|
//| VER | METHOD |
//|--------|-------------|
//| 1 | 1 |
//|--------|-------------|
//VER是SOCKS版本,这里应该是0x05;
//METHOD是服务端选中的方法。如果返回0xFF表示没有一个认证方法被选中,客户端需要关闭连接。
sprintf(result,"Length:%d\r\n VER:0x%d%d\r\nMETHOD:0x%d%d\r\n", numl,q00,q01,q10,q11);
MessageBoxA(NULL, result, "服务器返回结果:", NULL);
在这里,接受完数据后,socks5第一部分协议内容就算完成了,因为我选择的是账号密码认证方式,也只给服务器发送了那种连接方式,所以服务器最后返回我了一个5和2,如果是没有账号密码的认证方式,可以仔细看下协议内容这一部分是怎么发送消息。
下面是第二部分:
https://blog.csdn.net/hu421160052/article/details/88870940