TCP网络编程流程


套接字

struct sockaddr{ //通用套接字数据结构

sa_family_t sa_family; //协议族

char sa_data[14]; //协议族数据

}


实际使用sockaddr_in,在bind时或connect时再强行转换

struct sockaddr_in{ //以太网套接字数据结构

u8 sin_len;

u8 sin_familly;

u16 sin_port;

struct in_addr sin_addr;

char sin_zero[8];

}


服务器端:socket()->bind()->listen()->accept()->read()->write()->close()

客户端 :socket()->connect()->write()->read()->close()



socket()创建套接字,返回文件描述符

原型:int socket(int domain,int type,int protocol);

domain设置通信的域,指定协议族

PF_UNIX,PF_LOCAL

本地通信

PF_INET

IPv4 Internet协议

PF_INET6

IPv6 Internet协议

PF_IPX


PF_NETLINK

内核用户界面设备

PF_X25


PF_AX25


PF_ATMPVC


PF_APPLETALK


PF_PACKET

底层包访问

type的值和含义

SOCK_STREAM

TCP连接

SOCK_DGRAM

UDP

SOCK_SEQPACKET

序列化包

SOCK_RAW

提供原始网络协议访问

SOCK_RDM

提供可靠的数据报文类型,但可能数据会有乱序

SOCK_PACKET

专用类型,从设备驱动接受数据


protocol指定某个协议的特定类型,



bind()绑定一个地址端口

原型:int bind(int sockfd,const struct sockaddr *my_addr,socklen_t addrlen);


listen()监听本地端口

原型:int listen(int sockfd,int backlog);

backlog表示在accept处理之前等待队列中的客户端的长度。



accept()

原型:int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

addr传的是个指针,返回后得到指向客户端的地址的指针。


connect()

原型:int connect(int sockfd,struct sockaddr *,int addrlen);

write()

read()


close()


shutdown()

原型:int shutdown(int s,int how)

允许更多方式关闭套接字

SHUT_RD

切断读

SHUT_WR

切断写

SHUT_RDWR

切断读写,和close()一样



信号:

当尝试写时,如果服务端已关闭,则得到一个SIGPIPE信号,并终止进程