简体   繁体   中英

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. I used Visual Studio C++ 2010 Express to write the code.

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. My web server seems can receive the request from broswer but the web broswer cannont display anything. Here is my web server output from command line:

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.

There is no null character at the end of your buffer, so printf writes what's past that.

The Bytes Received: 100 shows your buffer is full.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM