我剛剛開始了一項任務,我必須創建一個處理http請求的簡單服務器。爲什麼我的http服務器打印出相同的字節? (C)
爲了讓我開始,我決定創建一個基本的服務器,等待連接,然後連續打印出從read()接收到的任何內容。
使用此代碼打印,我期望看到有\ r純文本HTTP請求和\ n通過<\r>
和<\n>
分別爲(我在我的網頁瀏覽器訪問http://ip:port)替換爲:
char buffer[buffer_size];
size_t bytes;
while ((bytes = read(s, buffer, buffer_size - 1)) > 0) {
buffer[bytes] = '\0';
int i = 0;
while(buffer[i] != '\0') {
if (buffer[i] == '\n') {
printf("%s","<\\n>\n");
} else if (buffer[i] == '\r') {
printf("%s","<\\r>");
} else {
printf("%c",buffer[i]);
}
i++;
}
}
然而,而我只是讓我的控制檯垃圾郵件交替<\r>
和一些看起來像001B寫在裏面(這是我的終端http://gyazo.com/13288989dc0c1f4782052a1914eb7f84圖片的鏈接)的一個奇怪的廣場。這是我的代碼問題嗎? Mozilla是否繼續故意發送垃圾郵件?
編輯:我的所有代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define buffer_size 1024
int main(int argc, char **argv) {
int port;
int client;
struct sockaddr_in6 my_add;
struct sockaddr_in6 their_add;
socklen_t their_add_size = sizeof(their_add);
if (argc != 2) {
printf("%s\n","Usage: ./server <port>");
return -1;
}
port = atoi(argv[1]);
my_add.sin6_family = AF_INET6;
my_add.sin6_addr = in6addr_any;
my_add.sin6_port = htons(port);
int s = socket(PF_INET6, SOCK_STREAM, 0);
if (s < 0) {
printf("%s","error on socket()");
return -1;
}
if (bind (s, (struct sockaddr *) &my_add, sizeof(my_add)) != 0) {
printf("%s","error on bind()");
return -1;
}
if (listen (s, 5) != 0) {
printf("%s","error on listen()");
return -1;
}
client = accept(s, (struct sockaddr *) &their_add, &their_add_size);
printf("%s","connected");
char buffer[buffer_size];
size_t bytes;
while ((bytes = read(s, buffer, buffer_size - 1)) > 0) {
buffer[bytes] = '\0';
int i = 0;
while(buffer[i] != '\0') {
if (buffer[i] == '\n') {
printf("%s","<\\n>\n");
} else if (buffer[i] == '\r') {
printf("%s","<\\r>");
} else {
printf("%c",buffer[i]);
}
i++;
}
}
if (bytes != 0) {
printf("%s","something went wrong. bytes != 0.");
return -1;
}
printf("%s", "connection closed");
close(s);
return 0;
}
什麼調試表現在緩衝? – pm100
@ pm100抱歉,我不確定你的意思?我只是基本上使用emacs作爲文本編輯器,並在終端 – toastedDeli
中編譯,您應該瞭解如何在調試器下運行您的程序。在Linux上,這將是GDB,你可以暫停程序檢查數據等谷歌'開始使用GDB' – pm100