1. 程式人生 > >TCP/IP程式設計之connect函式詳解

TCP/IP程式設計之connect函式詳解

函式原型:

CONNECT(2)                 Linux Programmer's Manual                CONNECT(2)

NAME
       connect - initiate a connection on a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

引數說明:

sockfd是由socket函式返回的套接字描述符,第二個、第三個引數分別是一個指向套接字地址結構的指標和結構的大小。

返回值:

返回:若成功則為0,若出錯則為-1

關於bind函式:

客戶端在呼叫connect前不必非得呼叫bind函式,因為如果需要的話,核心會確認源IP地址,並選擇一個臨時埠作為源埠,通常我們都不會在客戶端呼叫bind函式。

呼叫connect函式將會激發TCP/IP的三路握手過程,而且僅在連線建立成功或出錯時餐返回,其中出錯返回可能有以下幾種情況:

(1)  若TCP客戶端沒有收到SYN分節的響應,則返回ETIMEDOUT錯誤。舉例說,呼叫connect函式時,4.4BSD核心傳送一個SYN,若無響應則等待6s後再發送一個,若仍無響應則等待24s再發送一個。若總共等了75s後仍未收到響應則返回本錯誤。(注:sockfd預設是阻塞模式,非阻塞模式請參考文章:

socket超時詳解

(2) 若對客戶端的SYN的響應是RST(表示復位),則表明該伺服器主機在我們指定的埠上沒有程序在等待與之連線(例如伺服器程序也許沒在執行)。這是一種硬錯誤,客戶端一接受到RST就馬上返回ECONNREFFUSED錯誤。

  注:RST錯誤是TCP在發生錯誤時傳送的一種TCP分節。產生RST的三個條件是:

(a)目的地為某埠的SYN抵達,然而該埠上沒有監聽的伺服器。

(b)TCP想取消一個已有連線。

(c)TCP接收到一個根本不存在的連線上的分節。

(3) 若客戶端發出的SYN在中間的某個路由器上引發了一個“destination unreachable”(目的地不可達)ICMP錯誤,則認為是一種軟錯誤。客戶端主機核心儲存該訊息,並按第一種情況中所述的時間間隔繼續傳送SYN。若在規定的時間後仍未收到響應,則把儲存的訊息作為EHOSTUNREACH或ENETUNREACH錯誤返回給客戶端。以下兩種情況也是有可能的:一是按照本地系統的轉發表,根本沒有達到遠端系統的路徑;二是connect呼叫根本不等待就返回。

IPv4的TCP虛擬碼如下:

int sockfd = socket(AF_INET, SOCK_STREAM, 0); //TCP

short port = 9527; //伺服器埠
struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET; //IPv4
servaddr.sin_addr.s_addr = inet_addr("192.168.1.101"); //伺服器地址
servaddr.sin_port = htons(port);

int res = connect(sockfd, (sockaddr *)&servaddr, sizeof(sockaddr_in));


參考:《unix網路程式設計》·卷1

相關推薦

TCP/IP程式設計connect函式

函式原型: CONNECT(2) Linux Programmer's Manual CONNECT(2) NAME connect - initiate a connection on a

TCP/IP程式設計shutdown函式

前述: 終止網路連線的通常方法是呼叫close函式,close把描述符的引用計數減1,僅在該計數變為0時才關閉套接字。同時close會終止讀和寫兩個方向的資料傳送。 使用shutdown函式可以不管引用計數就激發TCP的正常連線關閉,同時shutdown也可以選擇性的關

TCP/IP程式設計fcntl函式

fcntl函式可執行各種描述符操作,在這裡我們只需要關心如何設定套接字為非阻塞式I/O 函式原型: FCNTL(2) Linux Programmer's M

react-redux connect 方法

Redux 是「React 全家桶」中極為重要的一員,它試圖為 React 應用提供「可預測化的狀態管理」機制。Redux 本身足夠簡單,除了 React,它還能夠支援其他介面框架。所以如果要將 Redux 和 React 結合起來使用,就還需要一些額外的工具,其中最重要的莫過於 react-redux 了。

connect函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Matlabgraythresh()函式

1 函式簡介 函式功能:使用 最大類間方差法找到圖片的一個合適的閾值(threshold)。在使用 im2bw函式將灰度影象轉換為二值影象時,需要設定一個閾值,這個函式可以幫助我們獲得一個合適的閾值。利用這個閾值通常比人為設定的閾值能更好地把一張灰度影象轉換為二值影象

QT訊號槽connect函式

使用QT開發時,通常使用connect函式只傳遞四個引數: connect(Sender,SIGNAL(signal),Receiver,SLOT(slot)); 所以我們有可能認為該函式就只有四個引數,但實際上是有第五個引數的,只是通常該函式已經給第五個引數賦值了而已,我們所使用的是預設值

Linux I/O複用select函式

置頂 2017年02月12日 20:50:08 難免有錯_ 閱讀數:7438更多 select函式的功能和呼叫順序 使用select函式時統一監視多個檔案描述符的: 1、 是否存在套接字接收資料? 2、 無需阻塞傳輸資料的套接字有哪些? 3、 哪些套接字發生了

OSI七層與TCP/IP五層網路架構

(1)OSI七層模型 OSI中的層 功能 TCP/IP協議族 應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 表示層 資料格式化,程式碼轉換,資料加密 沒有協議 會話層 解除或建立與別的接點的聯絡 沒有協

NIO程式設計ServerSocketChannel用法

之前一直看不懂NIO中的ServerSocketChannel和SocketChannel的區別,看了這篇博文,感覺通俗易懂,於是決定分享一下。。。。 在用nio通訊的過程我用以下情景給你模擬: 學校(ServerSocketChannel) 2。 學校教務處

十二、併發程式設計AbstractQueuedSynchronizer(AQS)

一、簡介 1、AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)是用來構建鎖或者其他同步元件(訊號量、事件等)的基礎框架類。 2、AQS的主要使用方式是繼承它作為一個內部輔助類實現同步原語,它可以簡化你的併發

ORACLE函式GREATEST函式例項

1語法GREATEST(expr_1, expr_2, ...expr_n)2說明GREATEST(expr_1, expr_2, ...expr_n)函式從表示式(列、常量、計算值)expr_1, e

計網--OSI七層與TCP/IP五層網路架構

OSI和TCP/IP是很基礎但又非常重要的網路基礎知識,理解得透徹對運維工程師來說非常有幫助。今天偶又複習了一下: (1)OSI七層模型 OSI中的層 功能 TCP/IP協議族 應用層 檔案傳輸,電子郵件,檔案服務,虛擬終端 TFTP,HTTP,SNMP,FT

mysqlgroup_concat函式:將相同的行組合起來

函式作用: 當SQL語句中使用到....group by....的時候, 該函式能夠將相同的行組合起來。 函式語法: group_concat( [DISTINCT]  要連線的欄位   [Order BY排序欄位ASC/DESC]   [Separator '分隔符'

Android程式設計DialogFragment原始碼(一)

DialogFragment是Fragment家族成員之一,如果你把它簡單的理解成Dialog,那就錯了。它的確可以做作dialog顯示,還可以顯示出自己定義的Dialog或者AlertDialog,但它同時也是一個Fragment。 按照官方的話來理解就是,你既可以把它當

javascript學習記錄(二)-function函式的應用sort()函式

javascript 雖然式一種弱指令碼語言,但是他也是支援函式的宣告的,此處的函式和java中的函式是有很大差別的。其中值得一提的是javascript 不支援重寫舉個栗子:function someFunction(num1){ console.info(num1);

Pythonprint函式

輸出的 print 函式總結: 1. 字串和數值型別 可以直接輸出 >>> print(1) 1 >>> print("Hello World") Hello World 2.變數無論什麼型別,數值,布林,列表,字典...都可以直接輸出

Spark核心程式設計RDD持久化

RDD持久化原理 Spark非常重要的一個功能特性就是可以將RDD持久化在記憶體中。當對RDD執行持久化操作時,每個節點都會將自己操作的RDD的partition持久化到記憶體中,並且在之後對該RDD的反覆使用中,直接使用記憶體快取的partition。這樣的

shell程式設計awk命令

linux本篇部落格主要介紹linux常用命令中的對文字和資料進行處理的命令awk的用法。awk命令awk是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/un

Lua函數語言程式設計和區域性函式

         函數語言程式設計中的函式這個術語不是指計算機中的函式(實際上是Subroutine),而是指數學中的函式,即自變數的對映。也就是說一個函式的值僅決定於函式引數的值,不依賴其他狀態。比如sqrt(x)函式計算x的平方根,只要x不變,不論什麼時候呼叫,呼叫幾次