Socket——API

socket常见API:

// 创建 socket ⽂文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);

// 绑定端⼝口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
1.服务器调用bind绑定一个固定的网络地址和端口号
2.bind成功返回0,失败返回-1
3.bind的作用是将参数sock和myaddr绑定在一起,事sock这个用于网络通信的文件描述符监听myaddr所描述的地址和端口号


// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
1.listen声明socket处于监听状态,并且允许有backlog个客户端处于连接等待状态,如果接到更多的连接请求就忽略
2.listen成功返回0,失败返回-1

// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,socklen_t* address_len);
1.三次握手完成后,服务器调用accept接受连接,如果还没有客户端连接请求,就阻塞等待
2.address参数是一个输出型参数,存放着客户端得地址和端口号
3.address_len是传入传出参数,传入缓冲区的address的长度以避免缓冲区溢出的问题,传出的是客户端地址结构体的事迹长度

// 建⽴立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
1.客户端需要调用connect连接服务器
2.connectbind参数一个,区别是bind的参数是自己的地址,而connect的参数是对方的地址
3.connect成功返回0,出错返回-1

socket是我们网络编程的接口,上面参数中我们不认的是 struct sockaddr* ,这个结构体是什么呢,我们看一下:

sockaddr结构:
struct sockaddr
{
    _SOCKADDR_COMMON(sa_);/*16位地址类型*/
    char sa_data[4];  /*14字节地址数据*/
}

sockaddr_in结构:
struct sockaddr_in
{
    _SOCKADDR_COMMON(sin_);
    in_port_t sin_port;                /*端口号*/
    struct in_addr sin_addr;          /*IP地址*/

    /*sockaddr的大小*/
    unsigned char sin_zero[sizeof(struct sockaddr)
    {
        _SOCKADDR_COMMON_SIZE;
        sizeof(int_port_t);
        sizeof(struct in_addr)];
    }
}

in_addr结构:
typedef uint32_t in_addr_t;
struct in_addr
{
    in_addr_t s_addr;
};

我们看一下sockaddr和sockaddr_in的结构:
这里写图片描述
IPv4地址用sockaddr_in结构体表示,包括16位地址类型,16位端口号和32位IP地址。
IPv4,IPv6地址类型分别定义为AF_INET,AF_INET6,这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是那种类型的sockaddr结构体,就知道了地址类型字段。

猜你喜欢

转载自blog.csdn.net/Shawei_/article/details/81455731
今日推荐