另一篇:
标准C实现WEB服务器
自己研究了好几天终于写出来一个,哈哈,当然也从网上得到了很多的帮助拉。谢谢大家咯!这个版本还不是很完善,但Web服务器的基本框架已经出来了,还有部分的功能需要进行进一步的测试和修改。虽然说C的开发比较慢,对于程序员来说比较难以操作,但通过用C写这些很底层的东西,可以更好的了解的象java的socket中的工作原理。有一定的帮助!
<wbr></wbr>
以下是源代码:
<wbr></wbr>
/**************filename: Server.cpp****************
<wbr>该程序通过标准socket实现简单Http服务器<br><wbr>运行该服务器可以通过浏览器访问服务器目录下的<br><wbr>Html文件和jpg图片 完成初步的Http服务器功能<br>***************************************************/</wbr></wbr></wbr>
<wbr>该程序通过标准socket实现简单Http服务器<br><wbr>运行该服务器可以通过浏览器访问服务器目录下的<br><wbr>Html文件和jpg图片 完成初步的Http服务器功能<br>***************************************************/</wbr></wbr></wbr>
#include <winsock.h>
#include <sys/stat.h>
#include <iostream>
using namespace std;
#include <sys/stat.h>
#include <iostream>
using namespace std;
#define SERVER_PORT 10000<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//自定义的服务端口<br>#define HOSTLEN 256<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//主机名长度<br>#define BACKLOG 10<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//同时等待的连接个数</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/**************************************
<wbr>该方法包装了send()<br><wbr>通过该方法发送数据 能够全部发出<br><wbr>没有遗漏<br>**************************************/<br>int sendall(int s, char *buf, int *len) {<br><wbr>int total = 0;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 已经发送字节数<br><wbr>int bytesleft = *len;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //还剩余多少字节<br><wbr>int n;<br><wbr>while(total < *len) {<br><wbr><wbr>n = send(s, buf+total, bytesleft, 0);<br><wbr><wbr>if (n == -1) { break; }<br><wbr><wbr>total += n;<br><wbr><wbr>bytesleft -= n;<br><wbr>}<br><wbr>*len = total;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 返回实际发送出去的字节数<br><wbr>return n==-1?-1:0;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 成功发送返回0 失败-1<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>该方法包装了send()<br><wbr>通过该方法发送数据 能够全部发出<br><wbr>没有遗漏<br>**************************************/<br>int sendall(int s, char *buf, int *len) {<br><wbr>int total = 0;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 已经发送字节数<br><wbr>int bytesleft = *len;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> //还剩余多少字节<br><wbr>int n;<br><wbr>while(total < *len) {<br><wbr><wbr>n = send(s, buf+total, bytesleft, 0);<br><wbr><wbr>if (n == -1) { break; }<br><wbr><wbr>total += n;<br><wbr><wbr>bytesleft -= n;<br><wbr>}<br><wbr>*len = total;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 返回实际发送出去的字节数<br><wbr>return n==-1?-1:0;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>// 成功发送返回0 失败-1<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/**************************************
<wbr>该方法处理错误请求<br><wbr>并向客户端发送错误信息<br>**************************************/<br>void wrong_req(int sock) {<br><wbr>char* error_head = "HTTP/1.0 501 Not Implemented\r\n";<wbr>//输出501错误<br><wbr>int len = strlen(error_head);<br><wbr>if (sendall(sock, error_head, &len) == -1) {<wbr><wbr><wbr>//向客户发送<br><wbr><wbr>printf("Sending failed!");<br><wbr><wbr>return;<br><wbr>}<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>该方法处理错误请求<br><wbr>并向客户端发送错误信息<br>**************************************/<br>void wrong_req(int sock) {<br><wbr>char* error_head = "HTTP/1.0 501 Not Implemented\r\n";<wbr>//输出501错误<br><wbr>int len = strlen(error_head);<br><wbr>if (sendall(sock, error_head, &len) == -1) {<wbr><wbr><wbr>//向客户发送<br><wbr><wbr>printf("Sending failed!");<br><wbr><wbr>return;<br><wbr>}<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char* error_type = "Content-type: text/plain\r\n";<wbr><wbr><br><wbr>len = strlen(error_type);<br><wbr>if (sendall(sock, error_type, &len) == -1) {<br><wbr><wbr>printf("Sending failed!");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char* error_end = "\r\n";<br><wbr>len = strlen(error_end);<br><wbr>if (sendall(sock, error_end, &len) == -1) {<br><wbr><wbr>printf("Sending failed!");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char* prompt_info = "The command is not yet completed\r\n";<br><wbr>len = strlen(prompt_info);<br><wbr>if (sendall(sock, prompt_info, &len) == -1) {<br><wbr><wbr>printf("Sending failed!");<br><wbr><wbr>return;<br><wbr>}<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/**********************************
<wbr>该方法判断用户请求的文件是否存在<br><wbr>不存在返回true 存在返回false<br>***********************************/<br>bool not_exit(char* arguments) {<br><wbr>struct stat dir_info;<br><wbr>return (stat(arguments, &dir_info) == -1);<br>}</wbr></wbr></wbr></wbr>
<wbr>该方法判断用户请求的文件是否存在<br><wbr>不存在返回true 存在返回false<br>***********************************/<br>bool not_exit(char* arguments) {<br><wbr>struct stat dir_info;<br><wbr>return (stat(arguments, &dir_info) == -1);<br>}</wbr></wbr></wbr></wbr>
/*************************************
<wbr>所请求的文件不存在<br>*************************************/<br>void file_not_found(char* arguments, int sock) {</wbr>
<wbr>所请求的文件不存在<br>*************************************/<br>void file_not_found(char* arguments, int sock) {</wbr>
<wbr>char* error_head = "HTTP/1.0 404 Not Found\r\n";<wbr><wbr><wbr>//构造404错误head<br><wbr>int len = strlen(error_head);<br><wbr>if (sendall(sock, error_head, &len) == -1) {<wbr><wbr><wbr><wbr>//向客户端发送<br><wbr><wbr>printf("Sending error!");<br><wbr><wbr>return;<br><wbr>}<wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char* error_type = "Content-type: text/plain\r\n";<br><wbr>len = strlen(error_type);<br><wbr>if (sendall(sock, error_type, &len) == -1) {<br><wbr><wbr>printf("Sending error!");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char* error_end = "\r\n";<br><wbr>len = strlen(error_end);<br><wbr>if (sendall(sock, error_end, &len) == -1) {<br><wbr><wbr>printf("Sending error!");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>char prompt_info[50] = "Not found:<wbr> ";<br><wbr>strcat(prompt_info, arguments);<br><wbr>len = strlen(prompt_info);<br><wbr>if (sendall(sock, prompt_info, &len) == -1) {<wbr><wbr><wbr><wbr>//输出未找到的文件<br><wbr><wbr>printf("Sending error!");<br><wbr><wbr>return;<br><wbr>}<wbr><wbr><wbr><wbr><br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/*************************************
<wbr>发送Http协议头部信息<br><wbr>其中包括响应类型和Content Type<br>*************************************/<br>void send_header(int send_to, char* content_type) {<br><wbr><br><wbr>char* head = "HTTP/1.0 200 OK\r\n";<wbr><wbr><wbr><wbr><wbr>//正确的头部信息<br><wbr>int len = strlen(head);<br><wbr>if (sendall(send_to, head, &len) == -1) {<wbr><wbr><wbr>//向连接的客户端发送数据<br><wbr><wbr>printf("Sending error");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>发送Http协议头部信息<br><wbr>其中包括响应类型和Content Type<br>*************************************/<br>void send_header(int send_to, char* content_type) {<br><wbr><br><wbr>char* head = "HTTP/1.0 200 OK\r\n";<wbr><wbr><wbr><wbr><wbr>//正确的头部信息<br><wbr>int len = strlen(head);<br><wbr>if (sendall(send_to, head, &len) == -1) {<wbr><wbr><wbr>//向连接的客户端发送数据<br><wbr><wbr>printf("Sending error");<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (content_type) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//content_type不为空<br><wbr><wbr>char temp_1[30] = "Content-type: ";<wbr><wbr><wbr><wbr>//准备好要连接的字串<br><wbr><wbr>strcat(temp_1, content_type);<wbr><wbr><wbr><wbr><wbr>//构造content_type<br><wbr><wbr>strcat(temp_1, "\r\n");<br><wbr><wbr>len = strlen(temp_1);<br><wbr><wbr>if (sendall(send_to, temp_1, &len) == -1) {<br><wbr><wbr><wbr>printf("Sending error!");<br><wbr><wbr><wbr>return;<br><wbr><wbr>}<br><wbr>}<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/***********************************
<wbr>取得用户所请求的文件类型<br><wbr>即文件后缀 (.html .jpg .gif)<br>************************************/<br>char* file_type(char* arg) {<br><wbr>char * temp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//临时字符串指针<br><wbr>if ((temp=strrchr(arg,'.')) != NULL) {<wbr><wbr><wbr><wbr>//取得后缀<br><wbr><wbr>return temp+1;<br><wbr>}<br><wbr>return "";<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//如果请求的文件名中没有. 则返回空串<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>取得用户所请求的文件类型<br><wbr>即文件后缀 (.html .jpg .gif)<br>************************************/<br>char* file_type(char* arg) {<br><wbr>char * temp;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//临时字符串指针<br><wbr>if ((temp=strrchr(arg,'.')) != NULL) {<wbr><wbr><wbr><wbr>//取得后缀<br><wbr><wbr>return temp+1;<br><wbr>}<br><wbr>return "";<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//如果请求的文件名中没有. 则返回空串<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/*************************************
<wbr>该方法为程序核心<br><wbr>负责真正发送文件 如*.html *.jpg等<br>*************************************/<br>void send_file(char* arguments, int sock) {</wbr></wbr>
<wbr>该方法为程序核心<br><wbr>负责真正发送文件 如*.html *.jpg等<br>*************************************/<br>void send_file(char* arguments, int sock) {</wbr></wbr>
<wbr>char* extension = file_type(arguments);<wbr><wbr><wbr><wbr>//获得文件后缀名<br><wbr>char* content_type = "text/plain";<wbr><wbr><wbr><wbr><wbr>//初始化type='text/plain'<br><wbr>FILE* read_from;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//本地文件指针从该文件中读取.html .jpg等<br><wbr>int readed = -1;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//每次读得的字节数<br><wbr><br><wbr>if (strcmp(extension, "html") == 0) {<wbr><wbr><wbr><wbr>//发送内容为html<br><wbr><wbr>content_type = "text/html";<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (strcmp(extension, "gif") == 0) {<wbr><wbr><wbr><wbr>//发送内容为gif<br><wbr><wbr>content_type = "image/gif";<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (strcmp(extension, "jpg") == 0) {<wbr><wbr><wbr><wbr>//发送内容为jpg<br><wbr><wbr>content_type = "image/jpg";<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>read_from = fopen(arguments, "r");<wbr><wbr><wbr><wbr><wbr>//打开用户指定的文件准备读取<br><wbr>if(read_from != NULL) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//指针不为空<br><wbr><wbr>char read_buf[128];<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//读文件时的字节缓存数组<br><wbr><wbr>send_header(sock, content_type);<wbr><wbr><wbr><wbr>//发送协议头<br><wbr><wbr>send(sock, "\r\n", 2, 0);<wbr><wbr><wbr><wbr><wbr><wbr>//再加一个"\r\n" 不能缺少 格式要求</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>while(!feof(read_from)) {<wbr><wbr><wbr><wbr><wbr><wbr>//判断文件是否已经结束<br><wbr><wbr><wbr>fgets(read_buf, 128, read_from);<wbr><wbr><wbr>//读取<br><wbr><wbr><wbr>int len = strlen(read_buf);<br><wbr><wbr><wbr>if (sendall(sock, read_buf, &len) == -1) {<wbr>//发送数据<br><wbr><wbr><wbr><wbr>printf("Sending error!");<wbr><wbr><wbr><wbr>//出现发送错误显示到控制台 继续发送<br><wbr><wbr><wbr><wbr>continue;<br><wbr><wbr><wbr>}<br><wbr><wbr>}<br><wbr>}<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/***********************************
<wbr>解析并处理用户请求<br>***********************************/<br>void handle_req(char* request, int client_sock) {</wbr>
<wbr>解析并处理用户请求<br>***********************************/<br>void handle_req(char* request, int client_sock) {</wbr>
<wbr>char command[BUFSIZ];<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//保存解析到的命令字段 GET PUT<br><wbr>char arguments[BUFSIZ];<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//保存解析到的请求的文件</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>/*<br><wbr> * 在用户请求前加上当前目录符号<br><wbr> */<br><wbr>strcpy(arguments, "./");<wbr><wbr><wbr><wbr><wbr><wbr><wbr>//注意该符号在不同操作系统的区别</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>/*<br><wbr> * 解析请求<br><wbr> */<br><wbr>if (sscanf(request, "%s%s", command, arguments+2) != 2) {<br><wbr><wbr>return;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//解析出错在返回<br><wbr>}<br><wbr><br><wbr>printf("handle_cmd:<wbr><wbr><wbr> %s\n",command);<wbr><wbr><wbr><wbr>//向控制台输出此时的命令<br><wbr>printf("handle_path:<wbr><wbr> %s\n",arguments);<wbr><wbr><wbr>//向控制台输出此时的请求路径<br><wbr><br><wbr>if (strcmp(command, "GET") != 0) {<wbr><wbr><wbr><wbr><wbr>//请求命令格式是否正确<br><wbr><wbr>wrong_req(client_sock);<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (not_exit(arguments)) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr>//请求的文件是否存在<wbr><wbr><br><wbr><wbr>file_not_found(arguments, client_sock);<br><wbr><wbr>return;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>send_file(arguments, client_sock);<wbr><wbr><wbr><wbr><wbr>//命令格式及请求路径正确则发送数据<br><wbr><br><wbr>return;<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/*************************************
<wbr>该方法构造服务器端的SOCKET<br><wbr>返回构造好的socket描述符<br>*************************************/<br>int make_server_socket() {<br><wbr>struct sockaddr_in server_addr;<wbr><wbr><wbr><wbr><wbr><wbr><wbr>//服务器地址结构体</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>该方法构造服务器端的SOCKET<br><wbr>返回构造好的socket描述符<br>*************************************/<br>int make_server_socket() {<br><wbr>struct sockaddr_in server_addr;<wbr><wbr><wbr><wbr><wbr><wbr><wbr>//服务器地址结构体</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>int tempSockId;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//临时存储socket描述符</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>tempSockId = socket(PF_INET, SOCK_STREAM, 0);<br><wbr><br><wbr>if (tempSockId == -1) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//如果返回值为-1 则出错<br><wbr><wbr>return -1;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>/*<br><wbr> * 填充服务器连接信息<br><wbr> */<br><wbr>server_addr.sin_family = AF_INET;<br><wbr>server_addr.sin_port = htons(SERVER_PORT);<br><wbr>server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");<wbr><wbr>//本地地址<br><wbr>memset(&(server_addr.sin_zero), '\0', 8);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (bind(tempSockId, (struct sockaddr *)&server_addr,<br><wbr><wbr>sizeof(server_addr)) == -1) {<wbr><wbr><wbr><wbr><wbr><wbr><wbr>//绑定服务如果出错 则返回-1<br><wbr><wbr>printf("bind error!\n");<br><wbr><wbr>return -1;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>if (listen(tempSockId, BACKLOG) == -1 ) {<wbr><wbr><wbr><wbr><wbr>//开始监听<br><wbr><wbr>printf("listen error!\n");<br><wbr><wbr>return -1;<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>return tempSockId;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//返回取得的SOCKET<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/***********************
<wbr>主函数main()<br><wbr>程序入口<br>***********************/<br>void main(int argc, char * argv[]) {</wbr></wbr>
<wbr>主函数main()<br><wbr>程序入口<br>***********************/<br>void main(int argc, char * argv[]) {</wbr></wbr>
<wbr>/*<br><wbr> * 调用WSAStartup() 便于访问sockets library<br><wbr> */<br><wbr>WSADATA wsaData;</wbr></wbr></wbr></wbr>
<wbr>if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {<br><wbr><wbr>fprintf(stderr, "WSAStartup failed.\n");<br><wbr><wbr>exit(1);<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>printf("My web server started...\n");</wbr>
<wbr>int server_socket;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//服务器的socket<br><wbr>int acc_socket;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//接收到的用户连接的socket<br><wbr>int sock_size = sizeof(struct sockaddr_in);<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>struct sockaddr_in user_socket;<wbr><wbr><wbr><wbr><wbr>//客户连接信息</wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>server_socket = make_server_socket();<wbr><wbr><wbr>//创建服务器端的socket</wbr></wbr></wbr></wbr>
<wbr>if (server_socket == -1) {<wbr><wbr><wbr><wbr><wbr><wbr>//创建socket出错<br><wbr><wbr>printf("Server exception!\n");<br><wbr><wbr>exit(2);<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr>/*<br><wbr> *<wbr>主循环<br><wbr> */<br><wbr>while(true) {<br><wbr><wbr>acc_socket = accept(server_socket, (struct sockaddr *)&user_socket, &sock_size);<wbr>//接收连接<br><wbr><wbr><br><wbr><wbr>//cout << inet_ntoa(user_socket.sin_addr) << endl;<wbr><wbr><wbr> //测试用:-)//<br><wbr><wbr><br><wbr><wbr>/*<br><wbr><wbr> *<wbr>读取客户请求<br><wbr><wbr> */<br><wbr><wbr>int numbytes;<br><wbr><wbr>char buf[100];<br><wbr><wbr>if ((numbytes=recv(acc_socket, buf, 99, 0)) == -1) {<br><wbr><wbr><wbr>perror("recv");<br><wbr><wbr><wbr>exit(1);<br><wbr><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><br><wbr><wbr>//printf("buf ... %s", buf);<wbr><wbr><wbr><wbr><wbr><wbr>//测试用</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr>/*<br><wbr><wbr> * 处理用户请求<br><wbr><wbr> */<br><wbr><wbr>handle_req(buf, acc_socket);<br><wbr>}<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
/**************程序结束Server.cpp******************/