看了好几天的socket编程了,觉得好像好多概念是懂非懂,决定实战一下。^_^,顺便写一个HTTP请求的响应,这个里面并没有进行数据的分析,然后读取文件响应,而是直接返回了一个字符串,不过只要能直接返回一个字符串可以成功的话,相信读取静态文件,或者读取其他文件来进行响应也没有什么难度了,^_^。刚开始学习,好多地方貌似都不太熟悉,不过总算搞出来了,挺爽的。网络编程以后大有可为,^_^,尤其是bs+cs模式。

得努力,^_^。回头把他改成一个简单的webserver,代码如下,如有什么地方有瑕疵,欢迎指教:)

[code=cpp]

// test.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include <winsock2.h>
#pragma comment(lib,”ws2_32.lib”)

/* 用户接入端口 */
#define PORT 9000
/* 同时连接数 */
#define BACKLOG 10
/* 缓存大小 */
#define BUFSIZE 10000
/* 定义HTTP协议返回文件头等信息 */
#define HTTPHEAD “HTTP/1.1 200 OK”
#define HTTPENCODING “Content-Type:text/html;charset:GBK”

int _tmain(int argc, _TCHAR* argv[])
{
/* 启动并开启套接字 */
WSADATA wsa;
memset(&wsa, 0, sizeof(wsa));
if (WSAStartup((WORD)((1<<8|1)), &wsa) != 0){
printf(“初始化出错!n”);
WSACleanup();
return -1;
} else {
printf(“初始化成功!n”);
}
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
printf(“创建Socket套接字出错!n”);
WSACleanup();
return -1;
} else {
printf(“创建Socket套接字成功!n”);
}
/* 绑定套接字 */
sockaddr_in bindAddr;
memset(&bindAddr, 0, sizeof(bindAddr));
bindAddr.sin_family = AF_INET;
bindAddr.sin_port = htons(PORT);
if (bind(sock, (sockaddr*)&bindAddr, sizeof(bindAddr)) == SOCKET_ERROR){
printf(“绑定Socket套接字出错!n”);
WSACleanup();
return -1;
} else {
printf(“绑定Socket套接字成功!n”);
}
/* 监听开始 */
listen(sock, BACKLOG);
while(1){
printf(“开始监听!n”);
/* 阻塞 */
sockaddr_in clientAddr;
memset(&clientAddr, 0, sizeof(clientAddr));
int len = sizeof(clientAddr);
SOCKET sockRev = accept(sock, (sockaddr *)&clientAddr, &len);
if (sockRev == INVALID_SOCKET){
printf(“阻塞连接出错!n”);
break;
} else {
printf(“阻塞连接成功!n”);
}
/* 接收数据 */
char buf[BUFSIZE];
memset(buf, 0, BUFSIZE);
if (recv(sockRev, buf, BUFSIZE, 0)==SOCKET_ERROR){
printf(“接受连接出错!n”);
break;
} else {
printf(“接受连接成功!n”);
}
printf(“接收到的数据如下:n%sn”, buf);
char rtn[BUFSIZE];
memset(rtn, 0, BUFSIZE);
sprintf(rtn, “%srn%srnrn%s”, HTTPHEAD, HTTPENCODING, “您所发送的请求已收到!</br>”);
if (send(sockRev, rtn, strlen(rtn), 0) ==  SOCKET_ERROR){
printf(“响应请求出错!n”);
break;
} else {
printf(“响应请求成功!n”);
}
printf(“本次循环结束,进入下一次!n”);
}
WSACleanup();
}

[/code]

发表评论

电子邮件地址不会被公开。 必填项已用*标注