使用C语言如何实现一个web服务器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
既然是基于tcp实现web服务器,很多学习C语言的小伙伴可能会很快的想到套接字socket.socket是一个较为抽象的通信进程,或者说是主机与主机进行信息交互的一种抽象.socket可以将数据流送入网络中,也可以接收数据流。
套接字的信息交互与本地文件信息的读取从表面特征上看类似,但其中所存在的编写复杂度是本地IO不能比拟的,但却有相似点。在赢下插座的交互交互步骤为:WSAStartup进行初始化——比;套接字创建套接字——比;绑定绑定——比;听监听——比;连接连接——比;接受接收请求——比;发送/recv发送或接收数据——比;closesocket关闭插座——比;WSACleanup最终关闭。
,,,,,,,,,,,,,,,,,,,,,,,,,,,,
了解完了一个套接字的基本步骤后我们了解一下一个基本网页请求的用户常规操作,操作分为:打开浏览器——在输入资源地址ip地址——祝辞得到资源。当目标服务器接收到该操作产生掉请求后,我们可以把服务器的响应流程步骤看为:获得请求请求——祝辞得到请求关键数据,在获取关键数据,在发送关键数据。服务器的这一步流程是在启动插座进行监听后才能响应。通过监听得知接收到请求,使用recv接收请求数据,从而根据该参数得到进行资源获取,最后通过发送将数据进行返回。
二、创建sokect完成监听
2.1 WSAStartup初始化
首先在C语言头文件中引入依赖WinSock2。h:
# include & lt; WinSock2.h>
在第一点中对插座的创建步骤已有说明,首先需要完成插座的初始化操作,使用函数WSAStartup,该函数的原型为:
int WSAStartup ( 词wVersionRequired, LPWSADATA LPWSADATA );
该函数的参数wVersionRequired表示WinSock2的版本号;lpWSAData参数为指向WSADATA的指针,WSADATA结构用于WSAStartup初始化后返回的信息。
wVersionRequired可以使用MAKEWORD生成,在这里可以使用版本1.1或版本2.2,1.1只支持TCP/IP,版2.1本则会有更多的支持,在此我们选择版1.1本。
首先声明一个WSADATA结构体,:
WSADATA WSADATA;
随后传参至初始化函数WSAStartup完成初始化:
WSAStartup (MAKEWORD(1, 1),和wsaData)
WSAStartup若初始化失败则会返回非0值:
如果(WSAStartup (MAKEWORD(1, 1),和wsaData) !=0) { 退出(1); }
2.2创建socket套接字
初始化完毕后开始创建套接字,套接字创建使用函数,函数原型为:
插座WSAAPI插座( int房颤, int类型, int协议 );
在函数原型中,房颤表示IP地址类型,使用PF_INET表示IPV4,类型表示使用哪种通信类型,例如SOCK_STREAM表示,TCP协议表示传输协议,使用0会根据前2个参数使用默认值。
int sk电讯=插座(PF_INET SOCK_STREAM 0);
创建完套接字后,若为1表示创建失败,进行判断如下:
如果(sk电讯==1) { 返回1; }
2.3绑定服务器
创建完插座后需要对服务器进行绑定,配置端口信息,IP地址等。首先查看绑定函数需要哪一些参数,函数原型如下:
int绑定( SOCKET套接字, const sockaddr * addr, int就奇怪 );
参数套接字表示绑定的插座,传入插座即可,addr为指向sockaddr_in的结构体变量的指针,在指向sockaddr_in结构体变量中配置一些服务器信息,就奇怪为addr的大小值。
通过绑定函数原型得知了我们所需要的数据,接下来创建一个指向sockaddr_in结构体变量用于配置服务器信息:
结构指向sockaddr_in server_addr;
随后配置地址家族为AF_INET对应的TCP/IP:
server_addr。sin_family=AF_INET;
接着配置端口信息:
server_addr。sin_port=htons (8080),
再指定ip地址:
server_addr.sin_addr。s_addr=inet_addr (“127.0.0.1");
ip地址若不确定可以手动输入,最后使用神器memset初始化内存,完整代码如下:
//配置服务器 结构指向sockaddr_in server_addr; server_addr。sin_family=AF_INET; server_addr。sin_port=htons (8080); server_addr.sin_addr。s_addr=inet_addr (“127.0.0.1"); memset (, (server_addr.sin_zero) & # 39; \ 0 & # 39; (8);使用C语言如何实现一个web服务器