私は C の初心者で、学校の課題では、Web ブラウザー (IE、firefox など) からの要求を受け入れ、適切な応答を返すことができる Web サーバーを作成する必要があります。Visual Studio C++ 2010 Express を使用してコードを記述しました。
これが私のコードです:
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define DEFAULT_PORT 5019
int main(int argc, char **argv){
char response[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html><html><head><title>Hello World</title></head>"
"<body><h1>Hello world!</h1></body></html>\r\n";
char szBuff[100];
int msg_len;
int addr_len;
struct sockaddr_in local, client_addr;
SOCKET sock, msg_sock;
WSADATA wsaData;
if (WSAStartup(0x202, &wsaData) == SOCKET_ERROR){
// stderr: standard error are printed to the screen.
fprintf(stderr, "WSAStartup failed with error %d\n", WSAGetLastError());
//WSACleanup function terminates use of the Windows Sockets DLL.
WSACleanup();
return -1;
}
// Fill in the address structure
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = htons(DEFAULT_PORT);
sock = socket(AF_INET,SOCK_STREAM, 0); //TCp socket
if (sock == INVALID_SOCKET){
fprintf(stderr, "socket() failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
if (bind(sock, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR){
fprintf(stderr, "bind() failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
//waiting the connection
if (listen(sock, 5) == SOCKET_ERROR){
fprintf(stderr, "listen() failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
printf("Waiting the connection........\n");
while(1){
addr_len = sizeof(client_addr);
msg_sock = accept(sock, (struct sockaddr*)&client_addr, &addr_len);
if (msg_sock == INVALID_SOCKET){
fprintf(stderr, "accept() failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
if (msg_sock == -1){
perror("Unable to accept connection.");
continue;
}
printf("accepted connection from %s, port %d\n",
inet_ntoa(client_addr.sin_addr),
htons(client_addr.sin_port));
msg_len = recv(msg_sock, szBuff, sizeof(szBuff), 0);
printf("Bytes Received: %d, message: %s from %s\n", msg_len, szBuff, inet_ntoa (client_addr.sin_addr));
msg_len = send(msg_sock, response, sizeof(response)-1 , 0);
if (msg_len == 0){
printf("Client closed connection\n");
closesocket(msg_sock);
return -1;
}
if (msg_len == SOCKET_ERROR){
fprintf(stderr, "recv() failed with error %d\n", WSAGetLastError());
WSACleanup();
return -1;
}
if (msg_len == 0){
printf("Client closed connection\n");
closesocket(msg_sock);
return -1;
}
closesocket(msg_sock);
}
WSACleanup();
}
このプロジェクトでは、Web サーバーが他のコンピューターから応答できる必要はありません。そのため、Web サーバーを実行している同じコンピューターで IE を使用するだけです。私の Web サーバーはブラウザからのリクエストを受信できるようですが、Web ブラウザは何も表示できません。コマンドラインからの私のWebサーバー出力は次のとおりです。
Waiting for connection......
accepted connection from 127.0.0.1, port 53108
Bytes Received: 100, message: GET / HTTP/1.1
Accept-Language: zh-HK
User-Agent: M烫烫烫烫HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
<doctype !html><html><head><title>Hello World</title></head><body><h1>Hello world!</h1></body></html>
from 127.0.0.1
サーバーがブラウザに応答するときに、ランダムな文字が発生するようです。どうすれば解決できますか? ところで、私は中国のオペレーティング システム (Window7) を使用しています。