c - 读取套接字缓冲区未读取

标签 c sockets

这可能是一个简单的问题,但我正在尝试使用 Geeks for Geeks 中的代码改编的套接字 API 来读取服务器响应 [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;
}

最佳答案

您正在连接到 HTTP 服务器。 HTTP 协议(protocol)规定客户端(即与服务器建立连接的一方)必须先发送请求。您没有发送请求,因此服务器不会向您发送回复。

此外,这是一个错误:

valread = read(server_fd, buffer, 2048);

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

%s 格式说明符只能用于 C 风格的字符串。它不能用于任意数据。一方面,它如何知道要输出多少字节?当前唯一包含信息的地方是 valread,您没有将它传递给 printf

关于c - 读取套接字缓冲区未读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56637319/

相关文章:

c - 从单链表中删除元素

c - 如何更改结构数组中的变量而不更改其他变量

c - qsort 函数导致问题

web-services - 套接字编程与 Web 服务?

java - 对于只有多个客户端的服务器,我应该使用套接字还是 nio?

c - 如何在 linux 上查看 wordsize

c - LwIP 上的 SO_RCVTIMEO 选项

python - 我可以访问远程机器上的 unix 域套接字吗?

c# - C#异步套接字: Is this thread-safe and correctly done?

c - docker 环境中不支持的系列套接字失败