VC如何写一个HttpServer的服务器?

解决方案 »

  1.   

    MSDN的找不到了
    http://www.vchelp.net/vchelp/archive.asp?type_id=76&class_id=1&cata_id=5&article_id=738&search_term=
      

  2.   

    http://www.vchelp.net/vchelp/type.asp?class_id=1&type_id=76
    http服务器
      

  3.   

    // 这个是我写的简单http server. 只支持静态的HTML网页.
    //
    // 测试方法: 把所有的网页文件放在c:/www/目录.默认页面是index.htm#include "stdafx.h"
    #define FD_SETSIZE 1024
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <iostream>
    #include <crtdbg.h>using namespace std;#pragma comment(lib,"ws2_32.lib")//-------------------------------------------------------------
    //从接收的字符串中取得文件名
    //-------------------------------------------------------------
    bool get_name(const char *buf,char *name)
    {
    //定位到第一个空格
    while( *buf != ' ' && *buf != '\n')
    buf++;
    buf+=2; //跳过其中的'/' if(*buf == ' ') //文件名中只有'/'时,自动设置文件名为index.htm
    sprintf(name,"index.htm");
    else
    {
    while( *buf != ' ' && *buf != '\n')
    *(name++) = *(buf++);
    *name = '\0';
    } return true;
    }//-------------------------------------------------------------
    //打包了send()函数,Send()函数将所有数据发完了才返回
    //-------------------------------------------------------------
    int Send(SOCKET s,const char *buf,int len)
    {
    _ASSERTE(len > 0);
    int tmp_len;
    int total_send=0;
    do
    {
    tmp_len = send(s,buf,len,0); if(tmp_len == -1)
    break; len -= tmp_len;
    buf += tmp_len;
    total_send += tmp_len;
    } while(len >0); return total_send;
    }//-------------------------------------------------------------
    //处理接收的数据
    //-------------------------------------------------------------
    void process_msg(SOCKET s, const char *buf, int buflen)
    {
    char buffer[4096];
    char name[512]="c:/www/";
    char *pname = name+strlen(name); if(get_name(buf,pname)) //取得完整的文件名
    {
    int nread;
    int nsend; FILE *fp = fopen(name,"rb");
    if(fp != NULL) //发送文件

    do 
    {
    nread = (int)fread(buffer,1,(int)sizeof(buffer),fp);
    if(nread == -1)
    break; nsend = Send(s,buffer,nread);
    if(nsend != nread)
    break;
    } while(!feof(fp)); fclose(fp);
    } } shutdown(s,SD_BOTH);
    }/************************************************************************/
    /* 简化版的服务器  
    /************************************************************************/
    int main(int argc,char **argv)
    {
    //WinSock初始化
    WSADATA ws;
    if(WSAStartup(MAKEWORD(2,2),&ws) != 0)
    cout << "WSAStartup() error : " << GetLastError() << endl; SOCKET listenfd;
    SOCKADDR_IN local={0};
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(1080);
    local.sin_family = AF_INET; int ret; //绑定,监听
    listenfd = socket(AF_INET,SOCK_STREAM,0);
    if(listenfd == INVALID_SOCKET)
    {
    cout << "socket() error : " << WSAGetLastError() << endl;
    return -1;
    } ret = bind(listenfd,(SOCKADDR *)(&local),sizeof(local));
    if(ret < 0)
    {
    cout << "bind() error : " << WSAGetLastError() << endl;
    return -1;
    } ret = listen(listenfd,10);
    if(ret < 0)
    {
    cout << "listen() error : " << WSAGetLastError() << endl;
    return -1;
    } SOCKET sock;
    SOCKADDR_IN client_addr;
    int addr_len; char buffer[4096]={0};
    int recv_len; while(1)
    {
    addr_len = sizeof(client_addr); //接受连接
    sock = accept(listenfd,(SOCKADDR *)&client_addr,&addr_len);
    if(sock != INVALID_SOCKET) //连接成功
    {
    recv_len = recv(sock,buffer,sizeof(buffer),0);
    printf(buffer);
    if(recv_len >0) //收到数据
    process_msg(sock,buffer,recv_len); //数据处理
    closesocket(sock);
    } } return 0;
    }