分兩種情況討論:機(jī)器連接不上或者是程序沒(méi)有起來(lái).
首先來(lái)看關(guān)于socket和TCP協(xié)議的幾個(gè)基本概念.
標(biāo)示一個(gè)socket,需要四元組:本機(jī)IP地址,本機(jī)端口,對(duì)端IP地址,對(duì)端端口號(hào).有了這四個(gè)元素,才能唯一的表示一個(gè)socket.其中,IP地址是定位一臺(tái)機(jī)器的,而端口號(hào)是定位機(jī)器上的一個(gè)進(jìn)程的.當(dāng)發(fā)起一個(gè)connect請(qǐng)求時(shí),首先是根據(jù)對(duì)端的IP地址找到相應(yīng)的機(jī)器,然后TCP連接數(shù)據(jù)被送往該機(jī)器的協(xié)議棧中,在協(xié)議棧中,查找是否有監(jiān)聽(tīng)所連接端口號(hào)的程序在運(yùn)行,如果有,則將該連接請(qǐng)求放入連接隊(duì)列中.否則,將給發(fā)起連接的機(jī)器發(fā)送RST報(bào)文.
回到開(kāi)始談到的兩種情況.
第一種情況,對(duì)端IP地址不能定位到一臺(tái)機(jī)器,也就是說(shuō),發(fā)出去的connect請(qǐng)求不會(huì)被任何協(xié)議棧接受(中間經(jīng)過(guò)的路由器之類的不算).TCP在這種情況下,會(huì)嘗試幾次連接,如果都沒(méi)有連接成功,則返回超時(shí)錯(cuò)誤.
第二種情況,機(jī)器定位到了,但是沒(méi)有對(duì)應(yīng)端口號(hào)的機(jī)器,則該請(qǐng)求會(huì)被協(xié)議棧接收,但是會(huì)返回一個(gè)RST報(bào)文.注意,這個(gè)RST報(bào)文是在對(duì)端收到三次握手的第一個(gè)報(bào)文的時(shí)候回復(fù)的.
因此,兩種情況下,connect都會(huì)返回-1報(bào)錯(cuò),進(jìn)一步的,如果要定位是哪一種錯(cuò)誤,可以通過(guò)查看errno來(lái)判斷.
man connect函數(shù)的結(jié)果告訴我們,分別是這兩種錯(cuò)誤號(hào):
ETIMEDOUT
Timeout while attempting connection. The server may be too busy to accept new connections. Note that for IP
sockets the timeout may be very long when syncookies are enabled on the server.
ECONNREFUSED
No-one listening on the remote address.