2010-03-18 99 views
3

这是一个异步套接字的场景,我不太明白......我有2个Tcp套接字,一个客户套接字&一个服务器套接字。我的服务器套接字绑定在端口上侦听&。C#Socket.BeginSend AsyncCallback行为(超时?)

我的客户端套接字连接到服务器套接字(使用BeginConnect/EndConnect)。然后,我使用BeginSend()向服务器发送消息。在服务器端,我不做Receive()或BeginReceive()。

什么情况是,我BeginSend调用指定我的AsyncCallback被调用&其IAsyncResult的告诉我,它完成&调用Socket.EndSend()不会引发任何异常......

有没有东西,我没有或者不应该只在BeginSend调用实际发送一些东西给服务器时调用AsyncCallback(即:服务器收到所有字节后调用的回调函数)?如果服务器上没有接收完成,那么在sendtimeout到期后我的回调不应该被调用,并且我对Socket.EndSend的调用会引发异常?

谢谢

回答

3

不,TCP/IP处理所有这些给你。连接两端都有缓冲区,可以保存数据直到可以接收数据。如果没有缓冲,发送健谈通信时可能会有可怕的延迟。

想像它邮寄一封信。它在你的邮箱里,直到邮件人拿起它。一旦发生,它就会被发送。尚未收到。它可能正在运送中,或者可能正在等待邮箱中供他们阅读。

因此,在BeginSend之后获得回调只会告诉您这是发送的。确定对方接收并处理数据的唯一方法是请求回复一些确认时间。

+0

等什么?在从服务器收到TCP ACK之前调用beginsend回调函数?我不确定我喜欢这个。 – Chris 2014-03-01 12:00:51