
簡単なポートフォワードのプログラムを作ろうと思って、
下のようなプログラムを組んでみました。
struct sockaddr_in cli ;
fd = SetupForClient(元IP, proto, port) ;
で、クライアントから接続を待って
clen = sizeof(cli) ;
recvfrom(fd, recv_data, sizeof(recv_data), 0,(struct sockaddr *)&cli, &clen) ;
でデータを受信して
fd2 = ConnectToServer(先IP, proto, port) ;
write(fd2, recv_data, sizeof(recv_data)) ;
で反対側のNICにデータを書き出す・・・。
という基本的なものなのですが、書き出す側に接続しようとすると
Connectの関数内で Address already in use というエラーが出てしまいます・・・。
fdを解放していないのかとも思ったのですが、再起動してもダメでした。
どういうことなのでしょうか・・・?
No.1ベストアンサー
- 回答日時:
どうも不思議なんですが…。
これって1つのプログラムですよね。
最初にSetupForClient()で接続待ちをして、fdでデータを受け取る。
次に、どこかで接続待ちをしているサーバにConnectToServer()内で
接続をして、fd2で書き出す。
という手順だと理解したんですがいいですか?
だとすると、ConnectToServer()内で"Address already in use"に
なるというのが非常に不思議です。
"Address already in use"はbind()を実行してるところで
出てると思うんですが、何でクライアント側(ConnectToServer()
内ではこのプログラムはクライアントとして他のサーバへの
接続を試みている)でbind()を実行する必要があるんでしょう?
クライアント側では、socket() -> connect() という流れで
いいんじゃなかったでしたっけ?記憶違いかと思って手元の
ソースを見てるんですが、そうなってます。
ですから、ConnectToServer()の中に、connect()システムコールがあって、
bind()システムコールもあるようなら、bind()は取っ払ってください。
もし、私の解釈が違ってて、ConnectToServer()内でも
SetupForClient()と同様、サーバとして接続待ちをしているんなら、
1.接続待ちポートをSetupForClient()と違うものに変える
どうしても同じポートを使いたいなら、
2.エラーが出なくなるまで待つ(ちゃんとclose()を
コールしてポートを閉じても、全てのデータが完全に
送受信されるように、同じポートがしばらく開けなく
なることがあります)
3.多分、SetupForClient()の中で、listen()、accept()の
引数として渡した待ち受け用ソケットを、SetupForClient()
の中で閉じてるかと思いますが、それを閉じずに使い回す。
通常、同じポートで連続して複数の接続を受け付けるには、
そのようにします。(普通は受け付け後さらにfork()します)
参考URL:http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socke …
この回答への補足
ありがとうございます。ソースが学校にあっていま確認できないのですが、よく考えるとクライアントでbindするはずないですよね・・・。
プログラムの動きは、お察しの通り、クライアントAのデータを受け取ってサーバBに転送するものです。
(マスカレードでも良いんですが、認証を組み込んでみたいので)
だとすると、サーバとしてSetupForClient内でbindしようとしてコケている、ということになりますか・・・。
ただ、Linuxを起動したてでまっさらの状態でもAlready in useが出てしまうんです。
とりあえず、月曜にポートを変えてもう一度やってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソケット通信について
-
Winsockで接続待ちタイムアウト...
-
クライアントソケットMACアドレ...
-
UDP通信について
-
ソケット通信 同じポート番号...
-
VB6のwinsockでconnectできない
-
Macターミナルで実行中のプログ...
-
VB6.0 SHELLで起動...
-
スロットゲームのプログラミング
-
フレームワークとプロセスの違...
-
STATUSのZフラグについて
-
CImage::ReleaseDC()のエラーで...
-
あるプログラム実行中に別のプ...
-
「単体テスト」に関する深刻な...
-
このレジの並び方は間違ってま...
-
CreateCompatibleDCを初期化時...
-
プロセスの停止
-
Linuxでのスレッド間メッセージ...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
VB6のwinsockでconnectできない
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
送信したデータの一部が文字化...
-
【ajax】 XMLHttpRequestオブジ...
-
ソケット通信
-
closeされたsocketへの動作につ...
-
wsdlからのサービス化を行い。
-
Cにおける通信プログラミングの...
-
UdpClient 送信元のIPアドレ...
-
非ブロッキングソケットのrecv...
-
ソケットを用いた1対多通信につ...
おすすめ情報