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

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

どういうことなのでしょうか・・・?

A 回答 (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が出てしまうんです。
とりあえず、月曜にポートを変えてもう一度やってみようと思います。

補足日時:2001/06/29 23:45
    • good
    • 0
この回答へのお礼

ありがとうございました。ポートを変更して無事に動くようになりました。もう少し勉強してみます。

お礼日時:2001/07/03 18:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRecipient address rejected: User unknown in local recipient tableのエラーについて

自動配信しているメールがあるのですが、
ある所からここ2週間ほど続けて以下のエラーメッセージが出ます。

< #5.0.0 X-Postfix; host xxx.xxx.xx.xxx[xxx.xxx.xx.xxx] said: 550 <メールアドレス>: Recipient address rejected: User unknown in local recipient table (in reply to RCPT TO command)>

User unknown in local recipient table とありましたので、アドレスのユーザー部分の間違いだろうと思い確認したところ、エラーは出ているもののそのメールは相手側には届いているとの返事が返ってきました。
となると、アドレスの登録間違いではないということになると思うのですが、これ以外で原因として考えられるものはあるのでしょうか?
もしお分かりになる方がいらっしゃっいましたら、是非教えてください。

Aベストアンサー

メールボックスが存在しないというエラーです。
相手のメールサーバ管理者へ、このメールのヘッダを添えて問い合わせた方が良いです。

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

QUSBのUnknown Debiceマークが消えない

USBのUnknown Debiceマークが消えない
操作ミスか何かでUSBに不具合が起こったらしく、デバイスマネージャーを開くと ユニバーサルシリアルバスコントローラーの中に 黄色の△!Unknown Device が現れています。これを右クリック~削除しても再起動したらまた現れています。黄色の△!Unknown Device を開いて全般タブを見ると、"問題が発生したのでこのデバイスは停止しました。(コード43)"と表示されています。
しかし USBに接続した周辺機器はいずれも支障なく動作しております。
このUnknown Debiceマークを削除する方法をお教えください。

Aベストアンサー

PCの情報が(型番、マザーボード、装着デバイスと型番、など)何も解りませんので、なんとも言えません。
次のチェックが必要だと思います。
1.全てのUSBデバイスを外してPC起動してもUnknown Deviceが出ますか。
2.マザーボードのBIOSやチップセットのドライバーは最新状態(Win7対応)ですか。

Qstruct tanka_kosuu kosuu[10];に付いているアンダーバー"_"の意味

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10];
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
int i;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
for ( i = 0; i < nyuuryoku_kosuu-1; i++ ){
kosuu[i].kingaku = kosuu[i].tanka * kosuu[i].kosuu;
printf("%d\t%d\t%d\n", kosuu[i].tanka,
kosuu[i].kosuu, kosuu[i].kingaku);
}
printf("goukei=%d\n",goukei_kingaku(kosuu, nyuuryoku_kosuu-1));
return 0;
}
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu)
{
int i;
int goukei = 0;
for ( i = 0; i < nyuuryoku_kosuu; i++ ){
goukei += kosuu[i].kingaku;
}
return goukei;
}

以下のプログラムで質問がございます。
C言語の構造体であるstructの変数であるtanka_kosuuですが
アンダーバー"_"を付けてあります。
(※struct tanka_kosuu kosuu[10];)
 これは、なんでつける必要があるのですか!?
  ご教授ができるお方がおられましたらよろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int goukei_kingaku(struct tanka_kosuu kosuu[], int nyuuryoku_kosuu);
int main()
{
struct tanka_kosuu kosuu[10...続きを読む

Aベストアンサー

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線で区切る "アッパーケース"

C言語の構造体の場合ですが、
慣習として スネークケース または キャメルケース あたりが一般的な様です。

というわけで質問の回答としては、
そのプログラムを作った人の命名規則が、構造体名はスネークケースだった。

ちなみに、
言語仕様的に使えないチェインケースを除いて、どの命名規則でもコンパイルエラーになることはありません。
ただし、コンパイラーとは別に静的コード解析をしている場合は、変な命名だと警告されるかもしれません。


以下参考です。

慣習の由来はたぶんこれ
http://www.amazon.co.jp/dp/4320026926

命名規則が パスカルケース または アッパーケース の例
https://msdn.microsoft.com/ja-jp/library/kbt00480.aspx

言語によっては、この手の命名規則についての公式ガイドラインがあります
http://www.oracle.com/technetwork/java/codeconventions-135099.html
https://msdn.microsoft.com/ja-jp/library/ms229043.aspx

変数や型などの識別名は、プログラム言語仕様により使用できる文字が制限されています。

多くの言語で空白文字は認められないので、複数の英単語からなる名前をつづる場合に
tankakosuu
では読みづらいので、以下の様な命名規則で単語間の区切りを表します。
tanka_kosuu // 下線で区切る "スネークケース"
tanka-kosuu // ハイフンで区切る "チェインケース"
tankaKosuu // 単語頭を大文字にする "キャメルケース"
TankaKosuu // 全ての単語頭を大文字にする "パスカルケース"
TANKA_KOSUU // 全て大文字で下線...続きを読む

QCONFIRMED PAYPAL SHIPPING ADDRESSについて

先日、e-bayで落札したらセラーから下の様なメールがe-bay経由できました。よく意味がわからないので詳しい方、ご協力お願致します。↓
Thank you for the prompt payment. Please send me a CONFIRMED PAYPAL SHIPPING ADDRESS. (This is the same address as on the credit card that you have on file with Paypal). I can only ship to a confirmed Paypal ADDRESS. Thank you very much!
PAPALのMY ACCOUNT→ACCOUNT INFORMATION→STREET ADDRESSに書いてあるアドレスを返信したところ下の様な回答がきました。↓
Thank you for sending the address. However, according to the information from Paypal, that is not a CONFIRMED PAYPAL ADDRESS. In order to ship your order, I must have a confirmed address. That should be the same address as on the credit card that you gave Paypal. Please send it so that I can ship your order. Thank you for your help.
セラーがいっているCONFIRMED PAYPAL ADDRESSは、Address Verification System(住所確認システム)に対応したクレジット会社のカードをPAPALに登録した時になるConfirmed addressの事をいっているのでしょうか?
もし、そうであれば日本のカード会社はAddress Verification Systemに対応していない様なので無理だと思うのですが、どの様に対応したら良いでしょうか?

先日、e-bayで落札したらセラーから下の様なメールがe-bay経由できました。よく意味がわからないので詳しい方、ご協力お願致します。↓
Thank you for the prompt payment. Please send me a CONFIRMED PAYPAL SHIPPING ADDRESS. (This is the same address as on the credit card that you have on file with Paypal). I can only ship to a confirmed Paypal ADDRESS. Thank you very much!
PAPALのMY ACCOUNT→ACCOUNT INFORMATION→STREET ADDRESSに書いてあるアドレ...続きを読む

Aベストアンサー

>セラーがいっているCONFIRMED PAYPAL ADDRESSは、Address Verification System(住所確認システム)に対応したクレジット会社のカードをPAPALに登録した時になるConfirmed addressの事をいっているのでしょうか?

その通りです。
ですので、国内発行のクレジットカードでは支払いを受け付けてもらえません。
ebayではpaypalアカウントやクレジットカード番号の不正使用などによる詐欺が多発しており、それによる損害を出品者が受けないように、このような措置を取っている出品者もいます。

対応策としては、マネーオーダーの郵送やbidpayを利用して支払うことが考えられます。
ただし、この場合はpaypalのような返金制度がないため、各種リスクを負担しなくてはなりません。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qmac-address-table secureとport securityの違い

Ciscoのmac-address-table secureとport securityの関連性がわかりません。
http://atnetwork.info/ccna3/mac_address_secure.html
mac-address-table secureでポートに接続できるmacアドレスを制限できて
(1)port securityとmac-address-table secureは何か関連はあるのでしょうか。port securityはmac-address-table secureが設定されていないと意味がないのでしょうか?

Aベストアンサー

>port securityはmac-address-table secureが設定されていないと意味がないのでしょうか?

意味がありません。

シスコ資格:CCNAへの道
スイッチング編 第6回 ポートセキュリティ
http://itpro.nikkeibp.co.jp/article/COLUMN/20080715/310842/?ST=nettech

上記のサイト内でも説明されている通り、「ポートセキュリティ」には以下の2つの設定が通常は必要です。

(1)ポートセキュリティの有効化
(2)セキュアMACアドレスの設定

で、セキュアMACアドレスには「スタティック」と「ダイナミック」の2つがあり、さらに「ダイナミック」にはスティッキーラーニングの設定もある、と。

質問者さんの利用しているサイト内では、単に「スタティック」の場合の説明があっただけです。

ただ、確か「mac-address-table secure」などはcat2900やcat2930などで使われていたものだったと思うので、最新のCCNAの試験の対象となっているcat2950の方のコマンド体系を覚えていった方がいいと思います。(例えば、上記のようなサイトとか。)

>port securityはmac-address-table secureが設定されていないと意味がないのでしょうか?

意味がありません。

シスコ資格:CCNAへの道
スイッチング編 第6回 ポートセキュリティ
http://itpro.nikkeibp.co.jp/article/COLUMN/20080715/310842/?ST=nettech

上記のサイト内でも説明されている通り、「ポートセキュリティ」には以下の2つの設定が通常は必要です。

(1)ポートセキュリティの有効化
(2)セキュアMACアドレスの設定

で、セキュアMACアドレスには「スタティック」と「ダイナミッ...続きを読む

Qint kosuu; とstruct tanka_kosuu kosuu[10]; の関係は

同プログラムの内容で現在3個の質問をしておりますが!
 その質問を解決する上で4つ目の質問をさせていただきます。
 悪しからず・・・
 さて
以下のサイトのプログラムで 些細な疑問がございます。
https://oshiete.goo.ne.jp/qa/9062058.html
 で
 struct tanka_kosuu {
int tanka; 
int kosuu; 
int kingaku; /
以上の中にあるkosuuと
 struct tanka_kosuu kosuu[10];のkosuu[10]とは直接関係がありますか?
 馬鹿な質問ばかりで申し訳ございませんがよろしくお願いいたします。

Aベストアンサー

#No.1です。

>kosuu[10];をakb[10];変えたところ 以下の errorでてコンパイルできません!?
> example10.c(15) : error C2065: 'kosuu' : 定義されていない識別子です。


宣言している変数名を変更したら、その変数を利用している場所(エラーメッセージで15行目と書かれています)の変数名も変更する必要があると思いませんか?

下の例で、1行目も変数をaからbに変えたら、2行目,3行目のaも、bに変える必要があのはご理解いただけますよね?
01: int a;
02: a = 10;
03: printf("a=%d\n", a);

Q/var/run/sudo/root/unknown

/var/run/sudo/rootディレクトリ直下にunknownという名前のファイルがあるのですが、ダブルクリックをしても、
「"/var/run/sudo/root/unknown"を表示できませんでした」
とポップアップ画面が現われるだけで中身を確認することができません。

削除しても問題ないでしょうか?
また、一般的に、/var/run/sudo/rootディレクトリの下には、どのような役割のファイルが配置されるものなのでしょうか?

※このunknownファイルのプロパティを確認したところ、サイズは51バイトで、MIME型は、application/octet-streamと表示されていました。
※OSは、Fedora7を使用しています。

Aベストアンサー

> unknownという名前のファイルがあるのですが、
> ダブルクリックをしても、
> 「"/var/run/sudo/root/unknown"を表示できませんでした」
windowsのように、Linuxは「あなた任せ」では何もできないです。

viエディタで見るとか、
geditで見るとか、
最悪、
hexdumpで見るとか
してください。

Qstruct tanka_kosuu kosuu[10];の[10]て何

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上ですが、
 struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
以上と
struct tanka_kosuu kosuu[10];は
 以下
int tanka;
int kosuu[10];
int kingaku;
 と同じ意味ですか?
 それとも
  int tanka[10];
int kosuu[10];
int kingaku[10]; 
 と同じ意味ですか?
int tanka[10];と
 int kingaku[10];の
 合計に[10]は必要ないですよね
以上すべて私の考え方が間違っていたならごめんなさい。
 以上よろしくお願いいたします。

#include <stdio.h>
struct tanka_kosuu {
int tanka;
int kosuu;
int kingaku;
};
int main()
{
         struct tanka_kosuu kosuu[10];
       構造体宣言 構造体名  変数名
struct tanka_kosuu kari_nyuuryoku = {-1, 0, 0};
int nyuuryoku_kosuu = 0;
while(kari_nyuuryoku.tanka != 0){
scanf("%d %d", &kari_nyuuryoku.tanka,
&kari_nyuuryoku.kosuu);
kosuu[nyuuryoku_kosuu] = kari_nyuuryoku;
nyuuryoku_kosuu++;
}
return 0;
}
以上です...続きを読む

Aベストアンサー

#1です。

>struct tanka_ data { ・・・・(1)
>  int tanka;
>  int kosuu;
>  int kingaku;
>};
・・・途中省略
>} これでいいでしょうか

(1)のところは、変えてはいけません。
struct tanka_kosuu { 
のままにして下さい。
他は、問題ありません。


人気Q&Aランキング

おすすめ情報