TCP网络套接字基础
1.套接字通用结构体
struct sockaddr sa_family_t sa_family; /*协议族*/
char data[14]; /*协议族数据*/ }
typedef unsigned short sa_family_t; 所以sa_family 是个16字节的变量
2.通常sockaddr结构体只是作为参数, 但是为了更为详细的设置,tcp通常使用
struct sockaddr_in {
u8 sin_len; /*结构体长度,16*/
u8 sin_family; /*协议族类型通常为AF_INET*/
u16 sin_port; /*16为端口号,网络字节序*/
struct in_addr sin_addr; /*ip地址32位*/
char sin_zero[8]; /*保留*/ }
struct in_addr {
u32 s_addr; /*ip地址32位,网络字节序*/
}
可以发现, sockaddr_in 和结构体sockaddr 大小是一致的,所以,可以使用
(struct sockaddr *)&sockaddr_in的形式来实现设置
用户层和内核层的交互过程
向内核传入数据的函数:send()、bind()
从内核得到数据的函数:accept()、recv()
#include <sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
AF_UNIX 本地通讯
AF_INET IPV4协议
AF_INET6 IPV6协议
type: SOCK_STREADM TCP字节流
SOCK_DGRAM UDP连接
SOCK_RAW 原始网络协议访问
这里注意的是SOCK_DGRAM和SOCK_RAW可以使用sendto()和recvfrom()函数发接数据
具体的内核中实现在net/socket.c中
tcp服务器:socket() ---> bind()----> listen()--->accept()---->read()/write()---->close()
客户端: socket()----->connect()---->read()/write()------>close();
详细的实例可以参考: