套接字
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信号,并终止进程