尝试使用 C 中的套接字从 http 网站检索 html 时连接被拒绝
Connection refused while trying to retrieve html from http website using sockets in C
我制作了一个非常简单的 http 客户端,它可以从 http 网站检索 html 并打印它。但是在使用 connect() function.Using 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 作为输入。
我已经看到了所有其他类似的问题,但没有得到任何关于如何解决这个问题的答案,因为在我尝试我的程序的每个网站上都会发生这种情况。
请告诉如何解决这个问题。
以下版本的代码适用于 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
inet_pton(3)
需要第一个参数来指定地址族,您已经为它传递了 0
(这与 AF_INET
不同),并且您必须传递 AF_INET
,根据您使用的协议族。
inet_pton(3)
是独立于协议族的转换例程,但需要知道实际使用的是什么才能正确转换地址。
顺便问一下,是否有服务器在监听请求的地址和端口?您是否测试过浏览器能够在 运行 您的程序之前从该地址获取某些内容?
我制作了一个非常简单的 http 客户端,它可以从 http 网站检索 html 并打印它。但是在使用 connect() function.Using 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 作为输入。
我已经看到了所有其他类似的问题,但没有得到任何关于如何解决这个问题的答案,因为在我尝试我的程序的每个网站上都会发生这种情况。 请告诉如何解决这个问题。
以下版本的代码适用于 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
inet_pton(3)
需要第一个参数来指定地址族,您已经为它传递了 0
(这与 AF_INET
不同),并且您必须传递 AF_INET
,根据您使用的协议族。
inet_pton(3)
是独立于协议族的转换例程,但需要知道实际使用的是什么才能正确转换地址。
顺便问一下,是否有服务器在监听请求的地址和端口?您是否测试过浏览器能够在 运行 您的程序之前从该地址获取某些内容?