从最简单的httpServer开始

2020-09-28  本文已影响0人  李伟13

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

上一篇下一篇

猜你喜欢

热点阅读