d
unknown
c_cpp
3 years ago
3.6 kB
7
Indexable
include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/types.h>
#include <netdb.h>
#define PORT 80
int main() {
int sockfd, new_socket, valread;
char link[1000] = {};
char hostName[1000] = {};
char path[1000] = {};
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd <= 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
struct sockaddr_in info;
bzero(&info, sizeof(info));
info.sin_family = AF_INET;
info.sin_port = htons(PORT);
printf("Enter the hostname: ");
scanf("%s", link);
int length = strlen(link);
int i = 0;
for (i = 0; i < length; i++) {
if (link[i] == '/') {
break;
}
hostName[i] = link[i];
}
while (i < length) {
path[i] = link[i];
i++;
}
struct hostent *h = gethostbyname(hostName);
if (h == NULL) return 1;
memcpy(&info.sin_addr, h->h_addr_list[0], h->h_length);
int err = connect(sockfd, (struct sockaddr *) &info, sizeof(info));
if (err == -1) printf("ConnectionERROR");
char buffer[1000];
char request[1000];
char reqFmt = "GET /%s HTTP/1.1\r\n";
char hostFmt = "Host : %s\r\n";
sprintf(request, reqFmt, path);
sprintf(buffer, hostFmt, hostName);
strcat(request, buffer);
strcat(request, "\r\n");
if (send(sockfd, request, sizeof(request), 0) < 0) {
printf("socket: Failed to send HTTP request");
return 1;
}
printf("socket: Start send HTTP request\n");
char response[100000] = {};
if (recv(sockfd, response, 100000, MSG_WAITALL) < 0) {
printf("socket: Failed to receive response");
return 1;
}
printf("socket: Start read the response\n");
printf("socket: Finish read to buffer\n");
printf("======== Hyperlinks ========\n");
int count = 0;
int replen = strlen(response);
for (int j = 0; j < replen; j++) {
if (response[j] == 'a' && response[j+1] == ' ' && response[j+2] == 'h' && response[j+3] == 'r' && response[j+4] == 'e' && response[j+5] == 'f') {
for (int k = j; ; k++) {
if (response[k] == '"') {
count++;
printf("\n");
break;
}
printf("%c", response[k]);
}
}
else if (response[j] == 'A' && response[j+1] == ' ' && response[j+2] == 'H' && response[j+3] == 'R' && response[j+4] == 'E' && response[j+5] == 'F') {
for (int k = j; ; k++) {
if (response[k] == '"') {
count++;
printf("\n");
break;
}
printf("%c", response[k]);
}
}
}
printf("There are %d hyperlinks in http://%s/.\n", count, hostName);
close(sockfd);
return 0;
}
Editor is loading...