int socket(int protofamily, int type, int protocol);//返回sockfd描述符
调用socket()接口创建一个socket链接的时候,返回的是一个描述符,它存于协议族空间内,但是没有一个具体的地址。
protofamily,协议族。常用的有IPV4(AF_INET), IPV6(AF_INET6), Unix域socket(AF_LOCAL/AF_UNIX)等等。协议族决定了socket的地址类型,如AF_UNIX用绝对路径,AF_INET用32位的IPV4地址和16为的端口号组合。
type,socket类型。常见的有SOCK_RAW, SOCK_PACKET, SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET等等。当protocol为0时,type会指定默认的protocol。
protocol,指定协议。常见的有TCP(IPPROTO_TCP)、UDP(IPPTOTO_UDP)、STCP(TPPROTO_STCP)、TIPC(IPPROTO_TIPC)。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//给socket()返回的描述符赋予一个特定的地址。
sockfd,socket()返回的描述符。bind()给这个描述符绑定一个地址。
addr,指向绑定给sockfd的协议地址。根据创建socket的时候的protofamily不同而不同。
服务端会调用bind绑定一个自身ip和端口组合的地址,以便于客户端通过这个地址来连接服务器。客户端则只需要connect()时随机生成一个即可。
socket在绑定地址的时候,必须将主机字节序转换为网络字节序。
主机字节序,不同的CPU有不同的字节序类型,其表示整数在内存中的存储顺序。
网络字节序,4个字节的值由低位到高位8个bit的顺序传输。
int listen(int sockfd, int backlog);
sockfd是监听的socket地址(已经bind绑定),backlog是最大连接数。
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);//clinet发送连接请求
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回连接connect_fd
sockfd是监听的套接字,addr是客户端的地址。
连接套接字,代表的是网络存在中的连接。
监听套接字,是listen的返回,accept的传入参数。
Server创建一个监听socket的描述符,一直存在于服务器的生命周期。内核中产生新的描述符-连接套接字使用的是和监听套接字一样的端口号。
Server和client的网络通讯读写操作:
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
异常错误:EINTR表示中断,ECONNREST表示网络连接问题。
int close(int fd);//读写后关闭相应socket描述符
close将相应的socket描述字引用计数-1,当计数为0的时候Server才会发送终止连接请求FIN。close将socket描述符关闭,Server不能再去进行读写操作。Server进入FIN_WAIT2状态,client进入CLOSE_WAIT状态。close后client发送数据到Server,而Server的读写端皆以关闭。client第一次发送数据时Server返回RST表示不再接受数据,如果第二次client发送数据给Server则不能发送成功,而产生一个SIGPIPE信号给应用层,导致程序终止。故此,client应检查这种被动关闭的情况。