2013-05-01 91 views
0

我是C的初學者,學校任務要求我編寫一個可以接受來自網絡瀏覽器(IE,firefox等)的請求的Web服務器,並給出適當的迴應。我使用Visual Studio C++ 2010 Express編寫代碼。通過Windows套接字編程開發Web服務器C

這裏是我的代碼:

#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服務器可以從其他計算機的響應,所以我只是用我的IE上運行Web服務器在同一臺計算機上。 我的網絡服務器似乎可以接收來自broswer的請求,但網絡瀏覽器不能顯示任何東西。這裏是我的網絡服務器從命令行輸出:

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)。

回答

1

緩衝區末尾沒有空字符,因此printf寫入了過去的內容。

Bytes Received: 100顯示您的緩衝區已滿。

相關問題