从零开始一个http服务器(一)【实战系列,持续更新】 - Go语言中文社区

从零开始一个http服务器(一)【实战系列,持续更新】


一个简单的socket server

  • 写一个helloworld
  • 复习c语言的socket  API
  • 一个简单的socket server
  • 用telent测试

从helloworld 开始

先来回顾下c语言的,c语言的helloword程序如下

// main.c
#include<stdio.h>

int main() {
    printf("hello world");
}

编译 gcc main.c
运行 ./a.out
输出 hello world

复习c语言的socket  API 

1.创建套接字

type:

  • SOCK_STREAM :TCP协议
  • SOCK_DGRAM :UDP协议

2.socket Address socket 地址结构体

3. 字节序和网络字节序

在网络数据传输中,为了方便起见统一成大端序

4.将字符串信息转换成网络字节序的整数型

5.bind 绑定地址信息

6. listen 监听函数

7. accept

注意:这里参数的地址是客户端地址信息

【代码】

//httpserver.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/in.h>

int main() {
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address,client_address;
    //创建套接字
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0); //协议族信息,套接字数据传输方式为面向消息的TCP
    //初始化服务器地址信息 sockaddr_in
    server_address.sin_family = AF_INET;//地址族
    server_address.sin_addr.s_addr = inet_addr(INADDR_ANY);  // 监听本机所有IP
    server_address.sin_port = htons(10000);    //  设置端口号,注意这里的 htons 方法(主机序转网络序,s指的是short)
    server_len = sizeof(server_address);
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

    listen(server_sockfd, 5);//设置同时监听最大个数,其实就是队列长度
    while(1) {
        char buffer[5000];
        char send_str[] = "hello world !n";  // 准备给连接过来的客户端发送的字符串
        client_len = sizeof(client_address);
        //accept的第一个参数是监听套接字,相当于门卫的功能;后两个都是客户端的地址信息
        client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, &client_len);//会新创建一个套接字传给client_sockfd
        read(client_sockfd, &buffer, 5000);    // 接收客户端传来的字符,存到buffer中
        printf("%s", buffer);     //  打印我们接收到的字符
        write(client_sockfd, &send_str, sizeof(send_str)/sizeof(send_str[0]));   // 向客户端发送数据,这里的 read write 和 和文件读写时没什么区别
        close(client_sockfd);
    }
}

 现在我们来一起编译运行我们的第一个http服务器吧!!

用 telnet 测试

新启一个终端,然后用telnet 尝试连接我们的服务器。
执行命令 telnet 127.0.0.1 10000
然后将想发给客户端的消息输入
屏幕输出大概为这样:

再返回查看我们的服务器屏幕,就能看到我们客户端发过来的信息,说明我们的服务器能成功接收并返回数据了。

怎么样,socket用起来是不是很....爽....... 

参考:《TCP/IP网络编程》韩.尹圣雨

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zpznba/article/details/89106225
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 06:24:37
  • 阅读 ( 1198 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢