这部分代码在做什么?

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';

pax*_*blo 6

它只是将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)