从 C 套接字中的浏览器接收的非 ASCII 字节



>我已经设法创建了一个接受来自Web浏览器连接的C服务器,但是,我从套接字收到的HTTP请求是随机字节,我似乎无法将其转换为ASCII值,如下所示:

00000000A9Ag_BD0000000000BD88_BD00C0B488_BD00<A7f_BD00F0,+_BD00A4f_BD0000000009D0000000000000b0D8FF0090a0D8FF00BD88_BD00C0E588_BD00F8و_BD000000000A9Ag_BD0000000000BD88_BD00000000000000000000FF00F8و_BD00000000000000000F8E788_BD00(`0000000000000C0E588_BD00F0`0D8FF00E0`0D8FF0087F096|00000080C00000090-ϾzFF<A7f_BD00FFFFFFFF00000 *_BD00D0++_BD00C0B488_BD00 <00000C0B488_BD00B0b0D8FF00FDA6=_BD00000000000000000000000000C0E1?D8FF000000 000|6g_BD0000000000000000000c0D8FF000000000&B0be0000*?g_BD0000000000&0000000C08A950000`E1?D8FF00000BD0000000000`E1?D8FF00|6g_BD00000000000000000pc0D8FF000000000.N=F6000080>g_BD0000000000.00000008F5D80000]*_BD00[*_BD000000000]*_BD00C8c0D8FF00A0c0D8FF00 !+_BD0080EB88_BD00F8E788_BD0000000000BA88_BD00C0B488_BD00D4@00000F0,+_BD0080@000000000000+00000hE288_BD008d0D8FF00d0D8FF00BA88_BD00C0E588_BD00hE288_BD000000000A9Ag_BD0000000000BA88_BD00000BD00000000000000000hE288_BD00D8E1?D8FF00F8E788_BD0000000000000000000000000C0E588_BD00pc0D8FF00`c0D8FF00.N=F60000v000000C20000000D4@00000F

公平地说,在终端中,它似乎确实"类似于"HTTP请求,但是,我不知道是什么失败了:(

任何帮助不胜感激...

#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#define BUFLEN 1024
#define PORT 8080
/*
 * Server.c
 *
 * Accept connections from a client
 *
 */
int main() {
    /* Useful Declarations */
    int fd, backlog, connfd;
    char buf[BUFLEN];
    struct sockaddr_in addr, cliaddr;
    socklen_t cliaddrlen;
    ssize_t rcount, i;
    /* IPv4 Declarations */
    addr.sin_addr.s_addr    = INADDR_ANY;
    addr.sin_family         = AF_INET;
    addr.sin_port           = htons(PORT);
    /* Create socket or return error */
    if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        fputs("Unable to create a socketn", stderr);
        return -1;
    }
    /* Bind socket to port or return error */
    if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
        fputs("Unable to bind socket to portn", stderr);
        return -1;
    }
    backlog = 1;
    /* Start listening to port or return error */
    if (listen(fd, backlog) == -1) {
        fputs("Unable to listen to portn", stderr);
        close(fd);
        return -1;
    }
    cliaddrlen = sizeof(cliaddr);
    /* Await for connection, or return error */
    if ((connfd = accept(fd, (struct sockaddr *) &cliaddr, &cliaddrlen)) == -1) {
        fputs("Unable to accept connectionn", stderr);
        close(fd);
        return -1;
    }
    /* Read up to 1500 bytes from socket or error*/
    if ((rcount = read(fd, buf, BUFLEN)) == -1) {
        fputs("Error occurred while reading from socketn", stderr);
        printf("Error Number: %dn", errno);
        for (i = 0; i < BUFLEN; i++)
            printf("%c", buf[i]);
        return -1;
    }
    close(fd);
    fputs("Socket closedn", stdout);
    return 0;
}

我知道这只会在客户端过早关闭连接时打印,但是当我到达它时,我可以稍后越过那座桥:)

三件事:

  • 您应该使用connfd,而不是fd读取 - fd是原始的收听套接字。
  • 打印缓冲区时,请使用rcount查看获得的字节数。
  • 这也意味着只有在rcount > 0时打印出缓冲区才有意义。

最新更新