TCP的連接
(1)服務器,調用socket, bind和listen,被動打開
(2)客服,調用connect,主動打開
1.爲了執行網絡I/O,一個進程必須做的第一件事就是調用socket函數,指定期望的通信協議類型,客戶端和服務器端都需要socket()函數(該套接字從socket()開始爲CLOSED狀態)
#include <sys/socket.h>
int socket(int family, int type, int protocol);
成功時返回爲非負描述符,出錯返回-1
2.TCP用戶調用connect函數來建立與TCP服務器的連接,套接字轉移爲SYN_SEND狀態,如果成功,則轉移爲ESTABLELISHED狀態。若失敗則該套接字不可再用,必須關閉,不能對這樣的套接字再次調用connect函數。
#include <sys/soket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
sockfd是socket函數返回的套接字描述符,第二,第三個參數分別是一個指向套接字地址結構的指針和該結構的大小
3.bind函數把一個本地協議地址賦予一個套接字,如ip地址+TCP端口號的組合,如果一個TCP客戶或服務器未曾調用bind捆綁一個端口,當調用connect或listen時,內核就要爲相應的套接字選擇一個臨時端口。進程可以把一個特定的IP地址捆綁到它的套接字上,不過這個IP地址必須屬於其所在主機的網絡接口之一。
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
4.listen函數僅由TCP服務器調用(1)