C GET请求仅获取空字符串

C GET请求仅获取空字符串,c,http,get,C,Http,Get,我得到了一个示例C代码,它将用户输入的请求发送到指定的服务器并打印响应。现在,我应该更改代码,以便使用Referer头集向发送HTTP请求。请求已成功发送,但响应中仅收到空字符串 我已经尝试发送最小的GET请求,并将来自Postman的工作请求粘贴到代码中,但我总是只得到一个空字符串作为响应。事实上,我需要很长时间才能收到回复,通常需要1到2分钟 这是到目前为止我的代码。建立连接似乎很好,但形成和发送请求并没有达到我预期的效果: #include <stdbool.h> //

我得到了一个示例C代码,它将用户输入的请求发送到指定的服务器并打印响应。现在,我应该更改代码,以便使用Referer头集向发送HTTP请求。请求已成功发送,但响应中仅收到空字符串

我已经尝试发送最小的GET请求,并将来自Postman的工作请求粘贴到代码中,但我总是只得到一个空字符串作为响应。事实上,我需要很长时间才能收到回复,通常需要1到2分钟

这是到目前为止我的代码。建立连接似乎很好,但形成和发送请求并没有达到我预期的效果:

#include <stdbool.h>     // use booleans in C
#include <stdlib.h>      // use common functions
#include <stdio.h>       // use input/output functions
#include <string.h>      // use string functions
#include <unistd.h>      // use POSIX functions

#include <sys/socket.h>  // use socket function
#include <netinet/in.h>  // use internet address datatypes
#include <arpa/inet.h>   // use inet_ntoa function
#include <netdb.h>       // use network database functions

int main(int argc, char *argv[]) {
    char *hostname = "stardrifter.org";
    int port = 80;

    /** -- Setup connection -- */

    // Get server host information
    struct hostent *serverInfo = gethostbyname(hostname);
    if (serverInfo == NULL) {
        printf("Failed to get info for host '%s'!\n", hostname);
        return -1;
    }

    // Create TCP/IP socket
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        printf("Failed to create socket!\n");
        return -1;
    }

    // Set address and port of server
    struct sockaddr_in serverAddr;
    serverAddr.sin_family = serverInfo->h_addrtype;
    serverAddr.sin_port = htons(port);
    memcpy(&serverAddr.sin_addr.s_addr, serverInfo->h_addr, serverInfo->h_length);

    // Connect to server
    if (connect(sock, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {
        printf("Failed to connect to server at %s:%d!\n",
               inet_ntoa(serverAddr.sin_addr), ntohs(serverAddr.sin_port));
        return -1;
    } else {
        printf("Connected to server at %s:%d\n\n",
               inet_ntoa(serverAddr.sin_addr), ntohs(serverAddr.sin_port));
    }

    /** -- Main program -- */

    char buffer[1024];
    int len = 0;

    char *request = "GET /cgi-bin/ref.cgi HTTP/1.1\r\nHost: www.stardrifter.org\r\nReferer: I'm a Referer\r\n\r\n";

    memset(buffer, 0, 1024);
    strncpy(buffer, request, sizeof buffer - 1);

    // Send message to server
    if (send(sock, buffer, len, 0) < 0) {
        printf("Failed to send message to server!\n");
    } else {
        printf("Sent message to server: \"%s\"\n", buffer);
    }

    // Receive response from server
    printf("Waiting for response...\n");
    memset(buffer, 0, 1024);
    if (recv(sock, buffer, 1024, 0) < 0) {
        printf("Failed to receive response from server!\n");
    }

    // Print received response
    printf("Received response from server: \"%s\"\n", buffer);

    // Close socket
    close(sock);

    return 0;
}


我不确定,我是否真的得到这个“”作为回应,或者是否有smth。例如超时,然后他只读取空缓冲区。

您发送的是零字节:

char buffer[1024];
int len = 0;

char *request = "GET /cgi-bin/ref.cgi HTTP/1.1\r\nHost: www.stardrifter.org\r\nReferer: I'm a Referer\r\n\r\n";

memset(buffer, 0, 1024);
strncpy(buffer, request, sizeof buffer - 1);

// Send message to server
if (send(sock, buffer, len, 0) < 0) {
    printf("Failed to send message to server!\n");
} else {
    printf("Sent message to server: \"%s\"\n", buffer);
}
send()
recv()
都返回发送或接收的字节数。他们这样做是有充分理由的。您需要检查返回的值,并确保它完全符合您的预期


另外,
send()
的第三个参数是
size\u t
,而不是
int
,您发送的是零字节:

char buffer[1024];
int len = 0;

char *request = "GET /cgi-bin/ref.cgi HTTP/1.1\r\nHost: www.stardrifter.org\r\nReferer: I'm a Referer\r\n\r\n";

memset(buffer, 0, 1024);
strncpy(buffer, request, sizeof buffer - 1);

// Send message to server
if (send(sock, buffer, len, 0) < 0) {
    printf("Failed to send message to server!\n");
} else {
    printf("Sent message to server: \"%s\"\n", buffer);
}
send()
recv()
都返回发送或接收的字节数。他们这样做是有充分理由的。您需要检查返回的值,并确保它完全符合您的预期


另外,
send()
的第三个参数是一个
size\u t
,而不是一个
int

请编辑该问题,以包括完整的标题和打开连接的部分。OT:关于:
printf(“未能创建套接字!\n”)1)错误消息应输出到
stderr
,而不是
stdout
。2) 当错误指示来自C库函数时,还应输出系统认为错误发生的文本原因。函数:
perror(“您的错误消息”)
正确处理所有与以下有关的信息:
printf(“无法将消息发送到服务器!\n”)当通信失败时,不要像通信成功一样继续执行代码。而是调用:
exit(exit\u失败)注意:
exit()
和exit_FAILURE`都是通过
stdlib.h
头文件公开的。这里是一个请编辑问题的示例,包括完整的头文件和打开连接的部分。OT:关于:
printf(“未能创建套接字!\n”)1)错误消息应输出到
stderr
,而不是
stdout
。2) 当错误指示来自C库函数时,还应输出系统认为错误发生的文本原因。函数:
perror(“您的错误消息”)
正确处理所有与以下有关的信息:
printf(“无法将消息发送到服务器!\n”)当通信失败时,不要像通信成功一样继续执行代码。而是调用:
exit(exit\u失败)注意:
exit()
int len = 0;

...

if (send(sock, buffer, len, 0) < 0) {
...
ssize_t bytes_sent = send( sock, request, strlen( request ), 0 );