美文网首页
从最简单的httpServer开始

从最简单的httpServer开始

作者: 李伟13 | 来源:发表于2020-09-28 08:54 被阅读0次

    struct sockaddr_in



    其中,port和sin_addr为网络字节序,hton()
    sock_addr常用于bind connect recvfrom sendto 等函数的参数.

    Socket

    socket可以算是一种特殊的文件,是"Open--Write/Read--Close"模式的一种实现
    普通文件的打开操作返回一个文件描述字,socket返回一个socket描述符

    #include <sys/socket.h>
    
    int socket(int family, int type, int protocol);
    httpfd = socket(AF_INET, SOCK_STREAM, 0);
    

    family(domain 协议域)AF_INET --- IPV4
    type(socker类型)SOCK_STREAM --- 面向连接的稳定数据传输
    protocol(协议)0选择与type一致的协议

    perror()

    #include <stdio.h>
    void perror (const char* str );
    
    perror(errinfo);
    

    perror(s) 用来将上一个函数发生错误的原因输出到标准设备(stderr)

    exit()

    函数名: exit()
    所在头文件:stdlib.h(如果是”VC6.0“的话头文件为:windows.h)
    功 能: 关闭所有文件,终止正在执行的进程。
    exit(0)表示正常退出,
    exit(x)(x不为0)都表示异常退出,这个x是返回给操作系统(包括UNIX,Linux,和MS DOS)的,以供其他程序使用。

    memset()

    #include <string.h>
    void* memset(void *s, int ch, size_t n);
    
    memset(&serveraddr, 0, sizeof(serveraddr));
    

    函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

    sockaddr_in

        memset(&serveraddr, 0, sizeof(serveraddr));
        serveraddr.sin_family = AF_INET;
        serveraddr.sin_port = htons(port);
        serveraddr.sin_addr.s_addr  = htonl(INADDR_ANY);
    

    INADDR_ANY表示不确定地址,任意地址

    getsockname()

    用法详见以下链接
    https://blog.csdn.net/coolingcoding/article/details/7392107
    在这里是获得分配的port到serveraddr的port中

    getsockname(httpfd, (struct sockaddr*)&serveraddr, &serveraddr_len)
    

    accept()

    connfd = accept(httpfd, (struct sockaddr*)&clientaddr, &clientaddr_len);
    connfd = accept(httpfd, (struct sockaddr*) NULL, NULL);
    

    accept返回客户端协议到clientaddr中,也可以不填.完成后穿件已连接描述字connfd

    pthread_create()

    https://www.cnblogs.com/qinshizhi/p/10972649.html

    recv() / send()

    #include <sys/socket.h>
    ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);
    ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
    

    https://blog.csdn.net/stpeace/article/details/73435564

    strcasecmp()

    strcasecmp() 函数比较两个字符串。且不区分大小写
    strcasecmp(s1,s2)用忽略大小写比较字符串,此函数只在Linux中提供,相当于windows平台的 stricmp。
    返回值:
    当函数的s1,s2在忽略大小写的情况下相等时,返回0,!返回值为1;
    当函数的s1,s2在忽略大小写的情况下不相等时,s1大于s2则返回正数,s1 小于s2 则返回负数。!返回值为0。

    sprintf()

    将一个格式化的字符串输出到一个目的字符串中

    将"HTTP/1.0 501 Method Not Implemented\r\n"写到buff中
    sprintf(buff, "HTTP/1.0 501 Method Not Implemented\r\n");
    
    
    将"abc" "kkk" "def"写到buff中
    sprintf(buff, "%skkk%s", "abc", "def");
    最终表现为"abckkkdef"
    

    strcmp()

    比较两个字符串是否相等
    相等返回0
    https://blog.csdn.net/Ctrl_qun/article/details/66970652

    strcat()

    strcat函数:
    将两个char类型连接。

    char d[20]="GoldenGlobal"; 
    char *s="View"; 
    strcat(d,s);
    结果放在d中
    printf("%s",d);
    输出 d 为 GoldenGlobalView 
    

    fgets()

    char *fgets(char *buf, int bufsize, FILE *stream);
    读取一行到buf中,return buf
    

    https://blog.csdn.net/zhiyeegao/article/details/80231555

    stat()

    #include <sys/stat.h>
    #include <unistd.h>
    int stat(const char *file_name, struct stat *buf);
    
    

    https://blog.csdn.net/zhoulaowu/article/details/14118897
    https://blog.csdn.net/zq627271551/article/details/54318732

    CGI:通用网关接口(Common Gateway Interface)

    waitpid()

    https://blog.csdn.net/csdn_kou/article/details/81091191

    相关文章

      网友评论

          本文标题:从最简单的httpServer开始

          本文链接:https://www.haomeiwen.com/subject/wbdhuktx.html