こちらのページに あったソースをWinSock 用に直して使用した。
コンパイルは以下のように打ち込む。
gcc main.c -lcrypto -lssl -lWs2_32
いささかてこずったが、無事終了した。
最初、毎日新聞のサイトで試したがうまくゆかず、
札幌市のページで試したら成功した。
朝日、読売、日経のサイトも成功したが、毎日新聞だけは接続エラーとなる。
原因不明である。
なを、C:\msys64\ucrt64\include\openss\opensslv.h を見ると、
OpenSSL のバージョンは "OpenSSL 3.6.0 1 Oct 2025" となっていた。
ソースはこちらから。
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <unistd.h>
#include <winsock2.h>
#include <ws2tcpip.h>
# include <openssl/ssl.h>
# include <openssl/err.h>
WSADATA wsaData;
SOCKET hsock;
int main(void) {
struct sockaddr_in server;
ADDRINFO hints, *res;
int rc=0;
SSL *ssl;
SSL_CTX *ctx;
char msg[100];
char *host = "www.city.sapporo.jp"; //札幌市
char *path = "/";
int port = 443;
rc=WSAStartup(WINSOCK_VERSION, &wsaData);
fprintf(stdout, "WSAStartup %d\n", rc);
// IPアドレスの解決
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
char *service = "https";
if ((rc = GetAddrInfo(host, service, &hints, &res)) != 0) {
fprintf(stderr, "Fail to resolve ip address - %d\n", rc);
return EXIT_FAILURE;
}
if ((hsock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) {
fprintf(stderr, "Fail to create a socket.\n");
return EXIT_FAILURE;
}
if (connect(hsock, res->ai_addr, res->ai_addrlen) != 0) {
printf("Connection error.\n");
return EXIT_FAILURE;
}
ctx = SSL_CTX_new(SSLv23_client_method());
ssl = SSL_new(ctx);
rc = SSL_set_fd(ssl, hsock);
rc=SSL_connect(ssl);
if (rc!=1) {
printf("Connection error %d.\n",rc);
return EXIT_FAILURE;
}
sprintf(msg, "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", path, host);
SSL_write(ssl, msg, strlen(msg));
char buf[buf_size];
int read_size;
do {
read_size = SSL_read(ssl, buf, buf_size);
write(1, buf, read_size);
} while(read_size > 0);
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
closesocket(hsock);
WSACleanup();
return EXIT_SUCCESS;
}
|
2026年1月9日
戻る