我想使用套接字向api发送请求。
我知道,在python工作的遗留代码中,服务正在运行。见以下节选:
class SocketConnection:
def __init__(self, payload, host):
self.payload = payload
self.host = host
self.sock = None
self.response_text = {}
self.status_code = None
self.full_resp = ""
def connect(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
context = ssl.create_default_context()
sock = context.wrap_socket(sock, server_hostname=self.host)
sock.connect((self.host, 443))
self.sock = sock
def send(self):
self.sock.send(self.payload)
def receive(self):
self.full_resp = self.sock.recv(4096).decode("utf-8")
self.response_text = [self.full_resp]
self.status_code = self.full_resp[9:12]
self.sock.close()我有以下C++代码,它将始终成功地找到它可以连接到的地址,但永远找不到传递SSL_connect的地址。SSL_get_error返回1。
array<struct addrinfo*, 2> get_valid_addrinfo(string s) {
struct addrinfo *res;
struct addrinfo hints;
memset(&hints, '\0', sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
hints.ai_flags = AI_ADDRCONFIG;
int e = getaddrinfo(s.c_str(), "https", &hints, &res);
if (e != 0) {
printf("failure %s\n", gai_strerror (e));
assert(-1);
}
int sock = -1;
struct addrinfo *r ;
SSL_CTX * ctx = make_ssl_context();
SSL * ssl;
for (r = res; r != NULL; r = r->ai_next) {
sock = socket(r->ai_family, r->ai_socktype, r->ai_protocol);
if (sock != -1 && connect(sock, r->ai_addr, r->ai_addrlen) == 0) {
free(ssl);
ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);
if (SSL_connect(ssl) != -1)
break;
}
if (sock != -1) {
close(sock);
sock = -1;
}
}
assert(sock != -1);
close(sock);
free(ssl);
SSL_CTX_free(ctx);
return {res, r};
}我在德比安10号。
我做错了什么?
发布于 2022-03-02 18:54:07
在尝试修复代码之前,应该向代码添加一些正确的错误报告,这样才不会在黑暗中射击。当OpenSSL调用失败时,您可以这样做:
unsigned long e = ERR_get_error ();
char errbuf [120]; // magic number, documented!
ERR_error_string (e, errbuf);然后根据您的意愿报告错误。
我发现ERR_error_string返回的字符串特别有用,事实上,OpenSSL维护了一个叫做“error堆栈”的东西,所以您应该在ERR_get_error上循环,直到它返回零(或者,如果您只想报告第一个错误,您可以调用ERR_clear_error,但是在继续之前以某种方式清除错误堆栈很重要)。如果你浏览文档,你可以阅读所有这些东西。
我看到Steffen刚刚回答了您的另一个查询,所以我不需要编写更多的内容:)不过,我知道云服务提供商(如Cloudflare )需要这样做。
https://stackoverflow.com/questions/71327350
复制相似问题