我有一个关于TCP套接字实现的connect()调用的问题.对于connect()调用来说,非阻塞是什么意思. connect()调用通过发送syn,等待SYNACK然后发送ACK,与其他一些套接字进行三次握手.如果连接成功,connect()调用也返回true,否则返回false.
如果调用是非阻塞的,那么我猜这意味着连接应该立即返回,即使它仍然在等待SYNACK,但是在这种情况下,当它无法连接时它永远不会返回false,因为那时它已经返回了.
所以我的问题:
– 对于connect()调用来说,非阻塞是什么意思.
– connect()调用如何实现?这只能使用线程吗?
– 我在java中模拟tcp堆栈,你能给出一个非阻塞版本看起来如何的简化例子吗?我包括了一个我认为阻塞版本大致看起来的草图(比实际的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.
正是你所说的.它不等待网络流量.
How does a connect() call achieve this? Is this only possible using threads?
如果你足够广泛地定义线程,那么答案是肯定的.但通常它并没有用我们通常认为的线程来实现.它只是告诉网络堆栈进行连接.网络堆栈发送数据包并响应定时器和网络中断等事情以保持进程.
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):
只是不要等待回复.确定是否可以发送SYN.如果没有,请返回错误.如果是这样,发送SYN.如果由于某种原因需要一个线程等待回复,那么你将不得不创建一个线程来做到这一点.
但是关于你的代码的一些东西从根本上被打破了.你要么在非阻塞案例和阻止案件中都需要一个线程,要么两者都不需要.在一个而不是另一个中需要一个线程是不可能的.如果在非阻塞情况下需要一个线程,那只是因为没有线程就无法运行TCP引擎.但是如果在阻塞情况下没有一个,则无法运行TCP引擎.当对方发送数据包时会发生什么?说另一方发送RST – 您的代码将如何回复?