suk*_*vir 1 c sockets ssl networking network-programming
我是c编程的新手.作为我的网络安全单一课程的一部分,我必须设计一个SSL握手模拟.我在网上找到了一个示例代码,但是我不了解代码的某些部分.你可以帮我跟进:
怎么(char) 0办?(send_data定义为char send_data[1024];)
send_data[0] = (char) 0; //Packet Type = hello
send_data[1] = (char) 3; //Version
Run Code Online (Sandbox Code Playgroud)
编辑+关注
伙计我知道什么类型的铸件.
我理解什么是铸造但是我发布的代码什么也没做.即使整数0被转换为一个字符,它也没有做任何事情,因为当你打印它时 - 它是空白的 - 没有价值.
例如:
#include <stdio.h>
#include <stdlib.h>
int main(){
char test;
int num;
num = 1;
test = (char) num; // this does nothing
printf("num = %d , %c\n",num,num);
printf("test = %d , %c\n",test,test);
// Isn't this the correct way to do it ?? :
num = 3;
test = '3'; // now this is a character 3
printf("num = %d , %c\n",num,num);
printf("test = %d , %c\n",test,test);
return 0;
Run Code Online (Sandbox Code Playgroud)
}
上面代码的输出是:
num = 1 ,
test = 1 ,
num = 3 ,
test = 51 , 3
Run Code Online (Sandbox Code Playgroud)
那为什么要这样做?这不是正确的方法: - send_data [0] ='0'; send_data [1] ='3';
它只是将int0(或3)转换为一个char类型.
它可能没有必要但可用于删除可能截断的警告.
一个更好的习语是:
send_data[0] = '\x00'; // Packet Type = hello
send_data[1] = '\x03'; // Version
Run Code Online (Sandbox Code Playgroud)
因为那些是明确的字符,而不必担心投射.
请记住(char) 0(或'\x00')与... 不一样'0'.前两个为您提供字符代码0(NULASCII中的字符),后者为您提供可打印 0字符的字符代码(字符代码48或'\x30'ASCII).这就是为什么你的打印不像你期望的那样表现的原因.
您的特定协议是否需要代码点0或可打印字符0是您尚未明确的.如果您真的想要模拟SSLv3,那么根据RFC6101,正确的值是二进制而不是可打印的值:
enum {
hello_request(0), client_hello(1), server_hello(2),
certificate(11), server_key_exchange (12),
certificate_request(13), server_done(14),
certificate_verify(15), client_key_exchange(16),
finished(20), (255)
} HandshakeType;
Run Code Online (Sandbox Code Playgroud)