簡単なポートフォワードのプログラムを作ろうと思って、
下のようなプログラムを組んでみました。
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で質問しましょう!
似たような質問が見つかりました
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/26 13:19
- デスクトップパソコン 阿武町4630万円誤送金事件。町工場ではPC98が現役なのに「未だにFDを使ってるの?」って・・・ 8 2022/06/01 19:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/03 12:30
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UDP通信におけるbind関数について
-
同じLAN内パソコンのIPアドレス...
-
エクセル VBA でのCOMポート...
-
recv関数でフリーズしてしまう
-
TCP/IP通信時のサーバーからの受信
-
UdpClient 送信元のIPアドレ...
-
VB6のwinsockでconnectできない
-
UDPで受信終了の合図を出して受...
-
名前付きパイプの通信ポートに...
-
ソケット通信のシミュレータツ...
-
ソケット通信の送受信遅延-02 ...
-
C言語でHTTP1.1のキープアライ...
-
空きポートの取得方法
-
vbでの232c接続プログラムについて
-
UDPのソケットプログラミング
-
ソケットでクライアントのipア...
-
マルチスレッドプログラミング...
-
iアプリでクイズのプログラムを...
-
Javaプログラム同士のプロセス...
-
Winsockを使わずにVBでSocketを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
エクセル VBA でのCOMポート...
-
UDP通信におけるbind関数について
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケット通信 同じポート番号...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Winsockで接続待ちタイムアウト...
-
ソケットを用いた1対多通信につ...
-
ソケットでクライアントのipア...
-
ソケットのクローズについて
-
相手のIPアドレスを取得する方法
-
SIPがNATを越えられない理由
-
Socket通信の0バイト受信について
-
CreateFile関数でCOMポートが開...
-
Connectエラーが出てしまう・・...
-
同じLAN内パソコンのIPアドレス...
-
送信したデータの一部が文字化...
おすすめ情報