网络编程函数笔记
C网络编程
1、创建套接字
函数原型
#include <sys/type.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
domain指定协议族,type参数指定套接字的通信类型,protocol指定使用的协议
type 取值包括SOCK_STREAM(流协议) 和 SOCK_DGRAM(数据报协议)
2、套接字地址
结构体原型
AF_UNIX 域
struct sockaddr_un {
sa_family_t sum_family;
char sun_path[];
};
该结构定义在sys/un.h中
AF_INET 域
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
};
该结构定义在netinet/in.h
结构体in_addr的结构定义为
struct in_addr {
unsigned long int s_addr;
};
3、命名套接字
#include <sys/socket.h>
int bind(int socket, const struct sockaddr *address, size_t address_len);
成功返回0,失败返回-1
4、创建套接字队列
函数原型
服务器创建一个队列来保存未处理的请求
#include <sys/socket.h>
int listen(int socket, int backlog);
backlog表示队列的长度,超过此长度的客户端请求将被拒绝。
5、接受连接
函数原型
#include <sys/socket.h>
int accept(int socket, struct sockaddr *address, size_t *address_len);
阻塞方法,直到客户端试图连接到socket套接字时才返回。
accept函数将创建一个新的套接字来与客户进行通信,并且返回新套接字的描述符。
6、请求连接
客户端程序使用一个未命名套接字连接到address指定的服务器套接字。
#include<sys/socket.h>
int connect(int socket, const struct sockaddr *address, size_t address_len);
7、主机字节序和网络字节序
不同的处理器使用不同的字节序来表示整数(分为大端,小端模式,和处理器的设计有关),这样从套接字传递的端口号或地址只是简单的逐一个字节的复制,那不同的计算机可能得到的结果并不相同。
以下函数原型将主机字节序转变为网络字节序,使结果在任何计算机都是相同的。
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
// host to network,long (htonl) 其他同理
Epoll 以内核事件描述符的方式检测IO
TCP/IP 笔记
IPv4头部结构TOS字段有四位,分别表示: 最小延时,最大吞吐量,最高可靠性和最小费用。