[英]Developing a Web Server by Windows Socket Programming C
I am a beginner of C and a school assignment requires me to write a web server that can accept the request from web browser (IE, firefox...etc), and give a proper response. 我是C语言的初学者,一个学校的作业要求我编写一个Web服务器,该服务器可以接受来自Web浏览器(即IE,firefox ...等)的请求,并给出适当的响应。 I used Visual Studio C++ 2010 Express to write the code. 我使用Visual Studio C ++ 2010 Express编写代码。
Here is my code: 这是我的代码:
#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();
}
The project does not require my web server can response from other computer, so I just use the IE on the same computer I run the web server on. 该项目不需要我的Web服务器可以从其他计算机上进行响应,因此我只在运行Web服务器的同一台计算机上使用IE。 My web server seems can receive the request from broswer but the web broswer cannont display anything. 我的Web服务器似乎可以接收来自浏览器的请求,但是Web浏览器无法显示任何内容。 Here is my web server output from command line: 这是我的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
It seems some random characters occur when the server response to the browser. 服务器响应浏览器时,似乎会出现一些随机字符。 What happened and how can I solve it? 发生了什么事,我该如何解决? I am using Chinese operating system (Window7) by the way. 顺便说一下,我正在使用中文操作系统(Window7)。
There is no null character at the end of your buffer, so printf
writes what's past that. 缓冲区的末尾没有空字符,因此printf
写出过去的内容。
The Bytes Received: 100
shows your buffer is full. Bytes Received: 100
的Bytes Received: 100
显示缓冲区已满。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.