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結構體,就知道了地址類型字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章