connect函數的用法
時間:2017-01-04作者(zhe):華清遠見(jian)
在網絡編程中(zhong),connect函數經常用來在套(tao)接(jie)字(zi)上初始(shi)化(hua)連接(jie)。無(wu)論(lun)是流式套(tao)接(jie)字(zi)還是數據報套(tao)接(jie)字(zi)都可以使用connect函數,但含義卻(que)不一(yi)(yi)樣(yang)。下(xia)面我們分別來討論(lun)一(yi)(yi)下(xia): 一、 流式(shi)套(tao)接字 流式(shi)套接(jie)(jie)(jie)(jie)字(zi)(zi)通(tong)常(chang)使用的是(shi)(shi)面向連接(jie)(jie)(jie)(jie)的協(xie)議(yi)(yi),如(ru)TCP協(xie)議(yi)(yi)。該類型套接(jie)(jie)(jie)(jie)字(zi)(zi)在(zai)雙方通(tong)信之前要(yao)先建(jian)立連接(jie)(jie)(jie)(jie)。具(ju)體說就是(shi)(shi)服務器端創建(jian)監聽(ting)套接(jie)(jie)(jie)(jie)字(zi)(zi)并綁定地址,客戶端調用connect函(han)數建(jian)立連接(jie)(jie)(jie)(jie)。該函(han)數原型如(ru)下: int connect(int sockfd, const struct sockaddr &serv_addr, socklen_t addr_len); sockfd是(shi)客(ke)戶(hu)端(duan)創建的(de)流(liu)式套接字;serv_addr指向存放服務(wu)器地址(zhi)信(xin)息的(de)結(jie)構體;addr_len是(shi)該結(jie)構體的(de)長(chang)度。 實際上,我們通過抓包分析可以(yi)得知:客戶端(duan)和服(fu)務器端(duan)通過如下三次握手后即建立好(hao)了(le)連接(jie)。
SYN
一旦建立好連接,客戶端就可以通過該套接字和服務器端通信了。需要注意的是:因為是建立好了連接,所以使用send/recv發送/接收數據,無需指定對方 二(er)、 數據報套接(jie)字 數(shu)(shu)(shu)據報套接字通(tong)常使用的(de)是無連接的(de)協議(yi)。該(gai)類套接字在雙方(fang)通(tong)信之前(qian)不用先建立連接,可以(yi)直(zhi)接使用sendto/recvfrom收發數(shu)(shu)(shu)據。但在發送數(shu)(shu)(shu)據時必須(xu)指定對(dui)方(fang)的(de)地址;在接收數(shu)(shu)(shu)據時通(tong)常也(ye)需要保存對(dui)方(fang)的(de)地址。 看到這里大(da)家應該發現了流式(shi)套接字和(he)數據報套接字的一個區別:前(qian)者只能(neng)和(he)一方通(tong)信;后者可以和(he)多方通(tong)信。 數據報套接字(zi)同樣可以使用connect函(han)數,但含義并不是建立連接而是限定(ding)該套接字(zi)只和(he)指定(ding)的一方通信。即未使用connect之前(qian),可以和(he)任意的地(di)址通信;而connect之后只能和(he)一方通信。 一旦connect之后,數(shu)據(ju)報套接字也可以使用send/recv收發數(shu)據(ju)了。如果想(xiang)和其他的(de)地址通(tong)信的(de)話,可以重新(xin)connect指定(ding)新(xin)的(de)地址。
相關資訊
發表評論
|