Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSL_读取上C块中的SMTP客户端_C_Email_Openssl_Smtp - Fatal编程技术网

SSL_读取上C块中的SMTP客户端

SSL_读取上C块中的SMTP客户端,c,email,openssl,smtp,C,Email,Openssl,Smtp,我一直在做一个小项目,这是一个用C编写的带有SSL的SMTP客户端 我正试图让它与GMail一起工作。我已经在GMail设置中启用了允许不安全的应用程序 当我尝试使用OpenSSL CLI通过命令OpenSSL s_client-connect smtp.gmail.com:465进行身份验证时,它工作正常,我得到了HELO和EHLO命令的正确响应(参见下面的输出) 但是一旦我用我的C客户端运行它,它在我发送helosmtp.gmail.com后就挂在SSL_-read上,它甚至没有给我任何关于

我一直在做一个小项目,这是一个用C编写的带有SSL的SMTP客户端

我正试图让它与GMail一起工作。我已经在GMail设置中启用了允许不安全的应用程序

当我尝试使用OpenSSL CLI通过命令
OpenSSL s_client-connect smtp.gmail.com:465
进行身份验证时,它工作正常,我得到了HELO和EHLO命令的正确响应(参见下面的输出)

但是一旦我用我的C客户端运行它,它在我发送
helosmtp.gmail.com
后就挂在SSL_-read上,它甚至没有给我任何关于
helosmtp.gmail.com
的输出

但是如果我只发送
HELO
,我会收到服务器的正确响应,说不允许空HELO

主要 设置 安全发送 记录安全 我用它运行了ltrace,它似乎在
SSL\u read
处被阻止,但
SSL\u pending
返回值为0

我似乎无法理解我在这里错过了什么

假设
mbuffer
是一个输入错误,而不是
buffer
的意思,这将写入8或4个字节(指针的大小,取决于您的平台),而不是您可能期望的缓冲区长度(这也是错误的,因为当应用于文本字符串时,
sizeof
还包括终止的空字节,smtp服务器将不接受该字节)

sizeof
更改为
strlen
可能会让您更进一步,但您的代码有很多问题,例如:


如果
SSL\u read
返回-1,这将(在最好的情况下;-)使您的程序崩溃。

是的,感谢您指出
SSL\u read
问题,我将修复该问题以及
send\u secure
函数中的问题
220 smtp.gmail.com ESMTP o3-v6sm18136158pgv.53 - gsmtp
HELO smtp.gmail.com
250 smtp.gmail.com at your service
AUTH LOGIN
334 VXNlcm5hbWU6
int main(int argc, char **argv) {
    setup("smtp.gmail.com", 465);
    printf("[INFO] -- %s\n", recv_secure());
    send_secure("HELO smtp.gmail.com\r\n");
    printf("[INFO] -- %s\n", recv_secure());
    send_secure("AUTH LOGIN\r\n");
    printf("[INFO] -- %s\n", recv_secure());
    close_secure();
    return 0;
}
int setup(char *hostname, int port) {
    SSL_CTX *ctx = init();

    struct hostent *host;
    struct sockaddr_in addr;
    int sock_fd;

    if((host = gethostbyname(hostname)) == NULL) {
        fprintf(stderr, "[ERROR] Unable to get host by name: %s", hostname);
        return -1;
    }

    sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    bzero(&addr, sizeof(addr));

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = *(long*)host->h_addr_list[0];

    if(connect(sock_fd, (struct sockaddr*) &addr, sizeof(addr)) != 0) {
        close(sock_fd);
        fprintf(stderr, "[ERROR] Unable to connect to remote server: %s\n", hostname);
        return -1;
    }

    ssl = SSL_new(ctx);
    SSL_set_fd(ssl, sock_fd);

    if(SSL_connect(ssl) == -1) {
        fprintf(stderr, "[ERROR] Unable to establish secure connection\n");
        close(sock_fd);
        return -1;
    }
    return sock_fd;
}
void send_secure(const char* buffer){
    SSL_write(ssl, buffer, sizeof(buffer));
}
char* recv_secure() {

    int bytes = SSL_read(ssl, rbuffer, SIZE);
    rbuffer[bytes] = 0;
    fprintf(stderr, "[DEBUG] -- Received: %s\n", rbuffer);
    return rbuffer;
}
void send_secure(const char* buffer){
  SSL_write(ssl, mbuffer, sizeof(mbuffer));
}
int bytes = SSL_read(ssl, rbuffer, SIZE);
rbuffer[bytes] = 0;