原文:https://beej.us/guide/bgnet/html/#connect
5.4 connect() --- 嘿,是你嗎?
現在我們假設你是個telnet 程序。你的用戶命令你得到套接字的文件描述符。你聽從命令調用了socket()。下一步,你的用戶告訴你通過端口 23(標準 telnet 端口)連接到"10.12.110.57"。你該怎麼做呢? 幸運的是,你正在閱讀 connect()--如何連接到遠程主機這一章。你可不想讓你的用戶失望。
下面是他的原型:
#include<sys/types.h>
#include<sys/socket.h>
connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
- sockfd 是系統調用socket() 返回的套接字文件描述符。
- serv_addr 是包含IP地址和端口的struct sockaddr。
- addrlen 是這個結構的長度。
我們還是使用getaddrinfo()函數返回的各個參數。
下面的例子是連接到www.example.com的3490端口:
struct addrinfo hints, *res;
int sockfd;
// first, load up address structs with getaddrinfo():
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo("www.example.com", "3490", &hints, &res);
// make a socket:
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
// connect!
connect(sockfd, res->ai_addr, res->ai_addrlen);
同時,你可能看到,我沒有調用bind()。
因爲我不在乎本地的端口號。 我只關心我要去那。
內核將爲我選擇一個合適的端口號,而我們所連接的地方也自動地獲得這些信息。一切都不用擔心。