Linux Socket Basic API

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);

server在创建socket并绑定后,就会监听连接状态,使用listen来查看是否有client connect。

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

server在listen时接受到了sever的connect请求,这时去用accept接受请求,以建立连接。accept是默认阻塞进程的,直到客户端建立连接完成后返回,accept返回的是的连接套接字。

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应检查这种被动关闭的情况。

你可能感兴趣的:(c++,linux,TCP)