-PR-
解決済み

Linuxでsocket接続をしているのですが・・・。

  • 困ってます
  • 質問No.97297
  • 閲覧数366
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 87% (362/412)

簡単なポートフォワードのプログラムを作ろうと思って、
下のようなプログラムを組んでみました。

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を解放していないのかとも思ったのですが、再起動してもダメでした。

どういうことなのでしょうか・・・?
通報する
  • 回答数1
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.1
レベル9

ベストアンサー率 71% (59/82)

どうも不思議なんですが…。

これって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()します)
補足コメント
pythian

お礼率 87% (362/412)

ありがとうございます。ソースが学校にあっていま確認できないのですが、よく考えるとクライアントでbindするはずないですよね・・・。
プログラムの動きは、お察しの通り、クライアントAのデータを受け取ってサーバBに転送するものです。
(マスカレードでも良いんですが、認証を組み込んでみたいので)

だとすると、サーバとしてSetupForClient内でbindしようとしてコケている、ということになりますか・・・。
ただ、Linuxを起動したてでまっさらの状態でもAlready in useが出てしまうんです。
とりあえず、月曜にポートを変えてもう一度やってみようと思います。
投稿日時 - 2001-06-29 23:45:23
お礼コメント
pythian

お礼率 87% (362/412)

ありがとうございました。ポートを変更して無事に動くようになりました。もう少し勉強してみます。
投稿日時 - 2001-07-03 18:40:58
-PR-
-PR-
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ