HTTP通信过程:
代码:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
int main()
{
//int socket(int domain,int type,int pro)
int sockfd=socket(AF_INET,SOCK_STREAM,0);//创建一个socket
// 返回-1出错,否则 返回文件描述符
assert(sockfd!=-1);
struct sockaddr_in ser,cli;
memset(&ser,0,sizeof(ser));//初始化0
ser.sin_family=AF_INET;//地址簇 PF-INET 协议簇
ser.sin_port=htons(80);//主机小端模式转化为网络的大端模式,80 web服务器专用
ser.sin_addr.s_addr=inet_addr("192.168.31.246");//ip地址
// 返回的文件描述符 服务器端的ip地址 第二个参数的长度
int res=bind(sockfd,(struct sockaddr *)&ser,sizeof(ser));
//绑定,/将端口号与ip地址 和 listenfd绑定起来,服务器被链接,将ip地址+端口号固定下来,客户端通过这个访问服务器
assert(res!=-1);//绑定失败 1 ip地址不对 2 端口号被占用 没有权限使用
listen(sockfd,5);
while(1)
{
int len=sizeof(cli);
int c=accept(sockfd,(struct sockaddr*)&cli,&len);
if(c<0)
{
continue;
}
char buff[1024]={0};
int n=recv(c,buff,1023,0);
if(n<0)
{
close(c);
continue;//如果出错,则关掉此次链接,处理下一客户端
}
printf("ip:%s,read:\n%s\n",inet_ntoa(cli.sin_addr),buff);
char sendbuff[1024]={0};
strcpy(sendbuff,"HTTP/1.1 200 OK\r\n");
strcat(sendbuff,"Server: httpser\r\n");
strcat(sendbuff,"Content-Length: 10\r\n");
strcat(sendbuff,"\r\n");
strcat(sendbuff,"HelloWorld");
send(c,sendbuff,strlen(sendbuff),0);
close(c);
}
return 0;
}
启动服务器,运行,出现这样的情况:
这里, 启动失败,没有权限,因为只有root身份才能监听1024以下的熟知端口。