Читать сокет буфер не читает - PullRequest
0 голосов
/ 17 июня 2019

это, возможно, простой вопрос, но я пытаюсь просто прочитать ответ сервера, используя API сокетов, адаптирующий код от Geeks для Geeks [site] 1 , когда я попытайтесь прочитать данные, они навсегда заблокированы в строке valread = read(server_fd, buffer, 2048); и не выполнят ни одного из отпечатков. Я что-то не так делаю?

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>

int send_request() {
  int server_fd, new_socket, valread;
  struct sockaddr_in address;
  int opt = 1;
  int addrlen = sizeof(address);
  char buffer[512] = {0};
  char *hello = "Hello from server";

  // Creating socket file descriptor
  if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
    perror("socket failed");
    exit(EXIT_FAILURE);
  }

  // Forcefully attaching socket to the port 8080
  if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
    perror("setsockopt");
    exit(EXIT_FAILURE);
  }

  // CONNECT TO HOST
  struct hostent *he;
  char* host = "www.columbia.edu";
  he = gethostbyname(host);

  if(!he) {
    printf("Host doesn't exist!\n");
    return 0;
  }

  address.sin_family = AF_INET;
  bcopy(he->h_addr, &address.sin_addr, sizeof(struct in_addr));
  address.sin_port = htons(80);


  if(connect(server_fd, (struct sockaddr *) &address, sizeof(struct sockaddr_in)) < 0) {
  printf("Error in the connection");
    return 0;
  }

  valread = read(server_fd, buffer, 2048);

  printf("%s\n", buffer);
  printf("%d\n", valread);
  printf("%d\n", errno);
  return 0;
}

int main(int argc, char const *argv[]) {
  send_request();
    return 0;
}

1 Ответ

2 голосов
/ 17 июня 2019

Вы подключаетесь к HTTP-серверу. Протокол HTTP указывает, что клиент (то есть сторона, которая устанавливает соединение с сервером) должен сначала отправить запрос. Вы не отправляете запрос, поэтому сервер не отправит вам ответ.

Также это ошибка:

valread = read(server_fd, buffer, 2048);

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

Спецификатор формата %s может использоваться только со строками в стиле C. Его нельзя использовать для произвольных данных. Во-первых, как он узнает, сколько байтов вывести? Единственное место, где в настоящее время содержится информация, находится в valread, и вы не передали ее в printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...