C socket如何接受网页的get请求,并向网页发送数据

19 篇文章 1 订阅
7 篇文章 0 订阅

目的:在centOS7中,打开网页,并在地址栏输入:http://localhost:8500/?aaa=7&&bbb=8  ,  然后在自己写得socket中收到这些数据,并把一个test.txt文件中的内容发送到网页上去。

第一步:在centos7的linux下新建一个目录: 比如是   /home/jintingbo/c/lianxi;

第二步:将win10下编辑好的test.txt文件传到linux的 /home/jintingbo/c/lianxi 下;

第三步:用vi在/home/jintingbo/c/lianxi/ 下编辑一个 mys_http_get_xiangying.c文件,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#include<sys/fcntl.h>

#define PORT 8500//端口号 
#define BACKLOG 5/*最大监听数*/ 

int main(){
    int sockfd,new_fd;/*socket句柄和建立连接后的句柄*/
    struct sockaddr_in my_addr;/*本方地址信息结构体,下面有具体的属性赋值*/
    struct sockaddr_in their_addr;/*对方地址信息*/
    socklen_t sin_size;

    sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket 
    if(sockfd==-1){
        printf("socket failed:%d",errno);
        return -1;
    }
    my_addr.sin_family=AF_INET;/*该属性表示接收本机或其他机器传输*/
    my_addr.sin_port=htons(PORT);/*端口号*/
    my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括号内容表示本机IP*/
    bzero(&(my_addr.sin_zero),8);/*将其他属性置0*/
    if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){//绑定地址结构体和socket
        printf("bind error");
        return -1;
    }
        listen(sockfd,BACKLOG);//开启监听 ,第二个参数是最大监听数 
        while(1){
            sin_size=sizeof(struct sockaddr_in);
            new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小 
            if(new_fd==-1){
                printf("receive failed");
            } else{
               char request[1024];
               recv(new_fd,request,1024,0);
               request[strlen(request)+1]='\0';
               printf("%s\n",request);
               printf("successeful!\n");
               char buf[520]="HTTP/1.1 200 ok\r\nconnection: close\r\n\r\n";//HTTP响应
               int s = send(new_fd,buf,strlen(buf),0);//发送响应
                //printf("send=%d\n",s);
                int f1 = open("test.txt",O_RDONLY);//消息体
                sendfile(new_fd,f1,NULL,2500);//零拷贝发送消息体
                close(f1);
                close(new_fd);

        }
    }
    return 0;
}

第四步: 用  gcc mys_http_get_xiangying.c -o mys_http_get_xiangying 命令编译这个C程序后就会得到 mys_http_get_xiangying这个程序。

第五步:用  ./mys_http_get_xiangying 运行这个程序, 如果提示权限不够,就用chmod对它的权限进行修改。

第六步:运行后没有反应是正常的,表示它正处于监听状态。

第七步: 在centos7中打开firfox浏览器,在地址栏输入:  http://localhost:8500/?aaa=7&&bbb=8  回车后,会在./mys_http_get_xiangying 运行的终端,会看到这个c语言的socket接收到的数据:

实验完毕。

本例所需要的知识点:1.C语言socket编程;2.http协议 中的响应格式。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庭博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值