java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思
我有一個關(guān)于TCP套接字實現(xiàn)的connect()調(diào)用的問題.對于connect()調(diào)用來說,非阻塞是什么意思. connect()調(diào)用通過發(fā)送syn,等待SYNACK然后發(fā)送ACK,與其他一些套接字進(jìn)行三次握手.如果連接成功,connect()調(diào)用也返回true,否則返回false.
如果調(diào)用是非阻塞的,那么我猜這意味著連接應(yīng)該立即返回,即使它仍然在等待SYNACK,但是在這種情況下,當(dāng)它無法連接時它永遠(yuǎn)不會返回false,因為那時它已經(jīng)返回了.
所以我的問題:
– 對于connect()調(diào)用來說,非阻塞是什么意思.
– connect()調(diào)用如何實現(xiàn)?這只能使用線程嗎?
– 我在java中模擬tcp堆棧,你能給出一個非阻塞版本看起來如何的簡化例子嗎?我包括了一個我認(rèn)為阻塞版本大致看起來的草圖(比實際的java更多的偽代碼):
public boolean connect(IpAddress dst, int port){
// create a syn packet and send it
ipLayer.send(.....,);
try{
// wait for a synack and store it in receive_packet
ipLayer.receive(...., receivePacket,);
} catch( TimeoutException e ){
// timed out.
return false;
}
// use information from a receivePacket to create an ack-packet then send it.
ipLayer.send();
return true;
}
最佳答案
So my questions: – What does it mean for a connect() call to be non-blocking.
正是你所說的.它不等待網(wǎng)絡(luò)流量.
How does a connect() call achieve this? Is this only possible using threads?
如果你足夠廣泛地定義線程,那么答案是肯定的.但通常它并沒有用我們通常認(rèn)為的線程來實現(xiàn).它只是告訴網(wǎng)絡(luò)堆棧進(jìn)行連接.網(wǎng)絡(luò)堆棧發(fā)送數(shù)據(jù)包并響應(yīng)定時器和網(wǎng)絡(luò)中斷等事情以保持進(jìn)程.
Im simulating a tcp stack in java, could you give a simplified example of how the non-blocking version would look? I included a sketch of what I think the blocking version roughly looks like (more psuedo code than actual java):
只是不要等待回復(fù).確定是否可以發(fā)送SYN.如果沒有,請返回錯誤.如果是這樣,發(fā)送SYN.如果由于某種原因需要一個線程等待回復(fù),那么你將不得不創(chuàng)建一個線程來做到這一點.
但是關(guān)于你的代碼的一些東西從根本上被打破了.你要么在非阻塞案例和阻止案件中都需要一個線程,要么兩者都不需要.在一個而不是另一個中需要一個線程是不可能的.如果在非阻塞情況下需要一個線程,那只是因為沒有線程就無法運行TCP引擎.但是如果在阻塞情況下沒有一個,則無法運行TCP引擎.當(dāng)對方發(fā)送數(shù)據(jù)包時會發(fā)生什么?說另一方發(fā)送RST – 您的代碼將如何回復(fù)?
總結(jié)
以上是生活随笔為你收集整理的java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最划算的贷款买车方式:信用卡分期购车
- 下一篇: 哪里回收黄金?各大黄金回收渠道汇总!