Соединение отклонено при попытке получить HTML с веб-сайта http, используя сокеты в C

Я сделал довольно простой http-клиент, который извлекал бы html с http-сайта и распечатывал его. Но, кажется, есть некоторая проблема при использовании функции connect (). Используя perror (), я обнаружил, что при выдаче соединения отказывается ошибка.

Это мой код

#include <string.h>
#include <stdio.h>
#include <iostream>

#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>

#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
char *address;
address = argv[1];

int c_socket = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in URLaddress;

URLaddress.sin_family = AF_INET;
URLaddress.sin_port = htons(80);
inet_pton(0,address,&URLaddress.sin_addr.s_addr);
int con = connect(c_socket, (struct sockaddr*) &URLaddress,
sizeof(URLaddress));

perror("error");

return 0;
}

Это вход

151.101.13.5

Это выход

error: Connection refused

Я передаю IP сайта в качестве ввода.

Я видел все другие подобные вопросы, но не получил никакого ответа, как это исправить, потому что это происходит с каждым веб-сайтом, на котором я пробую свою программу.
Пожалуйста, расскажите, как решить эту проблему.

0

Решение

Следующая версия кода работает на Windows / MSC:

int test(void)
{
char *address;
int c_socket, con;
struct sockaddr_in URLaddress;
char request[] = "GET / HTTP/1.1\r\n\r\n";
char response[4096];
WORD wVersionRequested;
WSADATA wsaData;

wVersionRequested = MAKEWORD( 2, 2 );

address = "151.101.13.5";

if (WSAStartup (wVersionRequested, &wsaData)!= 0) {
printf("DLL not found\n");
return -1;
}
if ((c_socket = socket(AF_INET, SOCK_STREAM, 0)) ==  INVALID_SOCKET ) {
printf("socket error: %d\n", WSAGetLastError());
return -1;
}

URLaddress.sin_family = AF_INET;
URLaddress.sin_port = htons(80);
URLaddress.sin_addr.s_addr= inet_addr(address);
con = connect(c_socket, (struct sockaddr*) &URLaddress, sizeof(URLaddress));

send(c_socket, request, strlen(request), 0);
recv(c_socket, response, sizeof(response), 0);
WSACleanup();

printf ("%s\n",response);

return 0;
}

Ответ:

<title>Fastly error: unknown domain </title>
</head>
<body>
<p>Fastly error: unknown domain: . Please check that this domain has been added to a service.</p>
<p>Details: cache-fra19128-FRA</p></body></html>5¸`¡qu
1

Другие решения

inet_pton(3) требуется первый параметр, чтобы указать семейство адресов, и вы передали 0 для него (который не совпадает с AF_INET), и вы должны были пройти AF_INETв соответствии с семейством протоколов, которые вы используете.

inet_pton(3) является процедурой независимого преобразования семейства протоколов, но она должна знать, что именно используется для правильного преобразования адресов.

Кстати, сервер прослушивает запрошенный адрес и порт? Вы проверяли, что браузер способен получить что-то с этого адреса перед запуском вашей программы?

0