2016-09-30 15 views
0

デバイスでLinux 2.6.33を使用しています。 TCPソケットを介してデバイスに接続するPCアプリケーションが使用されます。アプリケーションからの要求に応じて最大1 MBのデータが転送されます。TCPソケットを突然終了して再接続する方法

検討アプリケーションが接続され、正常に動作し、デバイスのIPアドレスが変更された場合(これはコマンドで可能です)。これで、アプリケーションで突然接続が切断されますが、デバイス上では接続が切断されます。しかし、ユーザーは新しいIPアドレスでデバイスに再接続することを期待しています。場合によっては、 "send()"が途中でデータをすべて送信していない可能性があります。その場合、すぐにソケットが閉じられるまでユーザーは再接続できません。

。シーケンス netstatの出力が示す「(靴下)近くのシャットダウン(靴下、RDWR)、」:

$ netstat -nt 
Proto Recv-Q Send-Q Local Address   Foreign Address   State 
tcp  0 29200 xx.xx.xx.xx:3000  xx.xx.xx.xx:50639  ESTABLISHED 

それが送信-Qは、まだ空ではありませんので、接続が設立した状態にまだあることを示しているように、これ。ソケットはある時間の後に閉じられ、どれくらいの時間であるか分かりませんソケット実装で定義されるかもしれません

PCアプリケーションから同じTCPポートを介して新しい接続が可能になるように、彼のソケットはすぐに?

+0

これは、保留中の送信を完了するか、応答がない場合に中止するまでに要する時間によって定義されます。私は、「ユーザーが新しいIPアドレスでデバイスに再接続することを期待している」という部分については理解していません。なぜ新しいIPアドレスですか? – EJP

+0

イーサネットIPアドレスはユーザコマンドによって変更されるため、ユーザは、IPが変更された直後に、新しいIPアドレスでアプリケーションを再起動する必要があります。 –

+0

保留中のSend-Qパケットを破棄して、この孤立したソケットを閉じる時間を調べるにはどうすればよいですか? –

答えて

0

ソケットを閉じるには常に時間がかかりますが、setsockopt()を使用して同じポートを再利用することができます。 detailこのリンクには、

0

以上の新しい接続がPCアプリケーションから可能になるようにこのソケットをすぐに閉じることはできますか?

あなたはもちろん、close()を呼び出すことによって、それを閉じて、しかし、あなたが本当に知りたいことは、あなたが近くにコールする際に知っているようにこの条件を検出する方法であることができます()。その答えは簡単ではありません。あなたのLinuxデバイスに関する限り、(the_old_ip_address)のクライアントは単に応答しなくなりました。 Linuxデバイスは、一時的なネットワークの停止ではなく、クライアントのIPアドレスが変更されていることを知る方法がないため、Linuxデバイスはタイムアウトするまで数分間試行し続けます。

問題を解決するまでは、一度に複数のTCP接続を受け入れてサービスできるように、サーバーを設計することをお勧めします。これを行うと、ユーザーは新しいIPアドレスからすぐに再接続し、待たずに作業を再開できるため、古いTCP接続が数分間続く場合は問題になりません。つまり、他の方法は、サーバーにタイムアウトを追加して、N秒間TCPソケット上でデータを送受信しない場合(Nの値が適切だと思った場合)、サーバーは明示的にソケット上でclose()を呼び出し、新しい着信接続を待機します。しかしこれは非常に良い解決策ではありません。なぜなら、TCP接続のパフォーマンス(つまり、「動作中」の状態では、少なくともN秒に1回は常にデータを送受信している)を前提としているためです。その想定は真実ではないかもしれません。つまり、クライアントとサーバーが何かを送信したくない場合、またはネットワーク接続が悪くてN秒以上データが通過しない場合です。この偽陽性につながる危険性があり、サーバーは依然として有効なTCP接続を閉じます。したがって、可能であれば、このアプローチではなく、最初のアプローチを推奨します。

関連する問題