java判断tcp是否阻塞_connect()调用在TCP堆栈中是非阻塞的(java)是什么意思

我有一个关于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 – 您的代码将如何回复?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值