ひとつ疑問なのですが、たとえばudpでパケットを送信するときに、sockaddr構造体を使って

dest_addr.sin_port = htons(10001);

などで送信先を定義しますよね。このとき、自分の発信元ポートは
決められないのでしょうか。

通信相手がマイコンでして、要求パケットを受けたら自分のステータスを
発信元にそのまま送り返すというシロモノで・・・発信元ポートがわからないと
サーバ側でlistenできないんです・・・。

パケットを拾ったところ、1045発10001着のようにランダムで決められているんですね。
なにかいいアイデアはありますでしょうか?

A 回答 (4件)

少し時間が取れたので、私も試してみました。



a-kuma> ポート番号だけじゃなくて、相手先のIPアドレスもきちんと設定しましたよね?

何を言ってるんでしょうね。思い付きの方は良かったのに、頭の中が腐ってる
ようです (^^;

No.3 の Fooky さんも「さっきやった間違い」とあるので、私だけが特に そこつ者
なわけではないようですが、思い込みがあったので、ちょっとはまりました。

■送信側

int sock = socket(PF_INET, SOCK_DGRAM, 0);

sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(2500);  // このポートに返して欲しい
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (sockaddr*)&addr, sizeof(sockaddr_in));

memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(1999);  // 送信の為のポート
memcpy(&addr.sin_addr.s_addr, gethostbyname("相手のホスト名")->h_addr_list[0], sizeof(addr.sin_addr.s_addr));

char* buf = "test message";
sendto(sock, buf, strlen(buf) + 1, 0, (sockaddr*)&addr, sizeof(sockaddr_in));


■受信側

int sock = socket(PF_INET, SOCK_DGRAM, 0);

sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(1999);
addr.sin_addr.s_addr = htonl(INADDR_ANY);

bind(sock, (sockaddr*)&addr, sizeof(sockaddr_in));

char buf[256];
int len;
recvfrom(sock, buf, sizeof(buf), 0, (sockaddr*)&addr, &len);
cout << "port: " << htons(addr.sin_port) << endl;

この回答への補足

わざわざありがとうございます。
自分のsockaddrをbindして、相手のaddrでsendtoするということですね。
ということは、ソケット転送のプログラムなので、

////////////////////////////////////
udp_socket = socket(AF_INET, SOCK_DGRAM,0);

memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(10001);
bind(udp_socket, (struct sockaddr *) &my_addr, sizeof(my_addr));
// クライアントからポート10001でデータを受信する
////////////////////////////////////

////////////////////////////////////
udp_socket2 = socket(AF_INET,SOCK_DGRAM,0);

bind(udp_socket2, (struct sockaddr*)&my_addr, sizeof(my_addr));

memset(&dest_addr, 0, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_addr.s_addr = inet_addr("192.168.253.1") ;
dest_addr.sin_port = htons(10001);
// 192.168.253.1のポート10001へデータを送信する
////////////////////////////////////

という形でいいのでしょうか?(長くてすみません・・・)
実は、これで試したところ再度1051番辺りからパケットが出てしまいまして・・・。
(ダブルNICなのでポートが同じなのは問題ありません)

自分で解釈しながらカスタマイズしてしまったのですが・・・試行錯誤してもわかりませんでした。お手数をおかけしてすみません。

補足日時:2001/07/11 13:59
    • good
    • 0
この回答へのお礼

なんとか解決しました。
どうも、ポートがだぶっていてbind()で失敗していたようです。エラー処理をつけたらあっさりと原因がわかりました(^^;
ありがとうございました。

お礼日時:2001/07/13 14:08

発信元でbind()して出来ませんか?


手元のプログラムをちょっと変えて
実験してみたら問題なくできましたよ。

・発信元ソケットにbindするポート番号は
 1025以上を使っているか? => bind()でPermission denied

  1024以下なら、スーパーユーザにならない
  とダメ

・他のプロセスが既に使っているポート番号を
 使っていないか?=> bind()でAddress already in use

あと、私がさっきやった間違いなんですが、

・bind()に渡すsockaddr構造体の値を代入する際に、
 sendto()に渡すsockaddr構造体への代入を真似て
 書きませんでしたか?=> sendto()でInvalid argument

  bind()に渡す分をsockaddr_in srcadr;とし、  
  sendto()に渡す分をsockaddr_in dstadr;とすると、
  srcadrの方は、sin_addr.s_addrにINADDR_ANYをセットし、
  dstadrのsin_addrメンバには、gethostbyname()で取得した
  hostent構造体のh_addr_list[0]の中身をコピーする。

私がさっき実験したときに気付いたのはこの程度です。
とにかく、方法としてはa-kumaさんが指摘された
方法で行けるようですよ。

(実験環境Linux-2.2.14 × 2台)
    • good
    • 0
この回答へのお礼

ありがとうございます、なんとか解決しました。
bindできないと叫んでいたのは、どうもポートがだぶっていてaddress already in useで失敗していたようです。エラー処理をつけたら簡単に見つかりました(おバカです・・・)
どうもありがとうございました。

お礼日時:2001/07/13 14:09

> bindしてみたところ、sendtoしても全くパケットが出なくなってしまいました



ポート番号だけじゃなくて、相手先のIPアドレスもきちんと設定しましたよね?

# 思い付きで振り回すのも、アレなんですが… (^^;

この回答への補足

はい。とりあえず、ソケット生成後の
sockaddr.sin_family
sockaddr.sin_port
sockaddr.sin_addr.s_addr
の3つは設定してあります。
思いつきだなんてとんでもない、ありがとうございます(^^;;

補足日時:2001/07/09 17:27
    • good
    • 0

> このとき、自分の発信元ポートは決められないのでしょうか。



普通 UDP で送信 sendto() するときには、bind() はしなくても良いのですが、
bind() してから、sendto() してみてはどうでしょうか?

# ちょっと思い付いただけで、試してみてません

この回答への補足

パケットのモニタリングをしながらやってみたのですが、bindしてみたところ、sendtoしても全くパケットが出なくなってしまいました・・・。難しいですね...(^_^;

補足日時:2001/07/09 15:57
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qプロバイダー変更で初期設定アカウントで送信できな

プロバイダーをOCNからBIGLOBEに変えて、設定もしてもらいました
で、メールを送信してみると出来ません
調べてみると「送信」の隣の「アカウント」がOCNとBIGLOBEの2つあり、OCNの方にチェックされています
BIGLOBEにチェックを入れると送信できるのですが
初期設定がOCNになってままなので、送信する度にアカウントをチェックし直さなけえばいけません
この場合、どこでどう設定し直せばよいのでしょうか?
OCNのアカウントは削除してしまって良いのでしょうか?

Aベストアンサー

キャリアメール(プロバイダメール)を使っている場合、プロバイダを変更すると、メールアドレスを変更をするか、しないかを、「最初に」考える必要が有ります。
48946 さんは、メールアドレスが変更を、考えずに、プロバイダの変更をしたのですか?。


> 調べてみると「送信」の隣の「アカウント」がOCNとBIGLOBEの2つあり、OCNの方にチェックされています

引き続き、キャリアメール(プロバイダメール)を使いたいのですね。
プロバイダをOCNからBIGLOBEへ変更して、メールソフト名が不明のメーラー(メールソフト)のアカウントでOCNにチェックがある為、OCNのアカウントが優先で送信します。
しかし、プロバイダのBIGLOBEOCNでは、OCNメールアドレスの設定が無いから、「OCNの設定」で送信することが出来ないのです。


> BIGLOBEにチェックを入れると送信できるのですが、初期設定がOCNになってままなので、送信する度にアカウントをチェックし直さなけえばいけません

OCNのメールアドレスを使いたいのなら、「OCNのプロバイダ契約」も残すことが必要だったのです。
つまり、OCNからBIGLOBEの二重契約が必要です。

OCNの契約が残っていれば、メーラー(メールソフト)が質問文有りませんので分かりませんが、OE(アウトルックエクスプレス)とか、Windowsメールとかなら、OCNのアカウントの方へ「既定」を設定です。

OCNの契約が無ければ、メーラー(メールソフト)のアカウントのOCNの「既定」を外して、BIGLOBEの方へ「既定」を設定するしかありません。

どうしても、OCNのメールアドレスを使いたいならば、プロバイダのOCNの契約をするしかありません。


> OCNのアカウントは削除してしまって良いのでしょうか?

私のすぐ上の回答の様に、48946さんが、キャリアメールのOCNのメールアドレスが、必要か不要かをお考えになって、不要と思いならば、削除してもいいでしょう。

-------------------------

キャリアメール(プロバイダメール)のほかに、フリーメール(無料メール/Webメール)と言うものがあります。
フリーメールは、インタネットが接続できるなら、パソコンを変えても違っても、他人のパソコンでも、世界中の何処でもメールの送受信が可能です。

ただし、欠点は、ID/PWがパソコンに残るのでセキュリティに注意することが必要です。(他人のパソコンなら、履歴を残さずに削除すること)
また、捨てメールアドレス(捨てメアド)として、複数を同時に取得したり、一時的に取得後すぐ解除したり、使い捨てしたり等、通販・いたずら等の偽の申込等のセキュリティ対策で取得する人も居ます。だから、セキュリティレベルが高いサイト等では、フリーメールの登録を拒否する所もあります。

フリーメール(古いサイトなので、中には現在と違うことがあります)
http://rich-navi.com/freemail-3.html
http://enchanting.cside.com/hp/freemail.html
http://www.kooss.com/freemail/

キャリアメール(プロバイダメール)を使っている場合、プロバイダを変更すると、メールアドレスを変更をするか、しないかを、「最初に」考える必要が有ります。
48946 さんは、メールアドレスが変更を、考えずに、プロバイダの変更をしたのですか?。


> 調べてみると「送信」の隣の「アカウント」がOCNとBIGLOBEの2つあり、OCNの方にチェックされています

引き続き、キャリアメール(プロバイダメール)を使いたいのですね。
プロバイダをOCNからBIGLOBEへ変更して、メールソフト名...続きを読む

QWinXPのHTTP_USER_AGENT

こんにちは、kusukusuです。

手元に、WinXPが無いので分からないのですが、
WinXPは、どのようなHTTP_USER_AGENTを吐くのでしょうか?

よろしくお願いします。

Aベストアンサー

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)

こんなん。NT6 では無いらしい。

Qメールフォーム:「必須項目」も「送信完了」画面もどちらも設定したい

JavaScript初心者です。よろしくお願い致します。
JavaScriptを使用してメールフォームを作成しています。

「送信」ボタンを押した後、必須項目確認はJavaScriptで作成できました。
「送信」ボタンを押した後、「送信完了」画面(別ページに飛ぶ設定)もJavaScriptで作成できました。
しかし【どちらの動作も一緒に設定】しようとすると上手く動いてくれません。

FORMのonSubmit設定+「送信」ボタン自体に「送信完了」のアラート表示する方法も試してみたのですが「送信完了」アラートが先にでてしまったり…。

「送信完了」の方法は別ページリンクでもアラートでもかまいません。
必須項目+最後に「送信」を押して、送信された後の何かリアクションを入れる方法を探しています。

教えて!Gooも初心者で何か失礼がありましたら申し訳ありません!どうかよろしくお願い致します。

Aベストアンサー

#2です。

メーラーを起動するタイプなんですね。
ちょっと勘違いしてました。
「送信完了」画面がCGIで、そのCGIによってメール送信していると思ったので。

フォームタグを
<form action="mailto:●@メールアドレス●" method="post" Accept-charset="shift_gis" Enctype="text/plain" name="myform">

サブミットボタンを
<input type="button" name="button" value="送信" onClick="Check();" />

入力項目確認ファンクションを
function Check(){
if(document.myform.name.value==""){
alert("名前を入力してください。");
return false;
}
if(document.myform.email.value==""){
alert("メールアドレスを入力してください。");
return false;
}
document.myform.submit();
location.href="送信完了画面アドレス";
}

に変えてお試しあれ。

#2です。

メーラーを起動するタイプなんですね。
ちょっと勘違いしてました。
「送信完了」画面がCGIで、そのCGIによってメール送信していると思ったので。

フォームタグを
<form action="mailto:●@メールアドレス●" method="post" Accept-charset="shift_gis" Enctype="text/plain" name="myform">

サブミットボタンを
<input type="button" name="button" value="送信" onClick="Check();" />

入力項目確認ファンクションを
function Check(){
if(document.myform.name.value==""){
alert("...続きを読む

Q初学者_Python_1

Pythonについての質問です。

初歩も初歩、もしかしたらPythonというよりはコマンドプロンプトの質問かも知れませんが・・・

Python27のファイルをC直下におき、初歩の初歩「Hello,world」の.pyファイルをつくってみました。
そして走らせようとしたところ、むりでした。表示は画像の通りです。

パスが通ってないわけではないようです。
どういうことでしょう。

ちなみに、直接
print"hello,world"
では
hello,world
と表示されます。

Aベストアンサー

windowsのコマンドプロンプトでpython(改行)と入力した場合は
インタプリタが起動して'>>>'が表示されます。
この状態では、print文のようなpythonのコマンドを直接入力してその結果が表示されます。
インタプリタを終了させるのは、Ctrl+ZまたはCtrl+Cです。


ファイルに書いたpythonのプログラムを実行する場合は
windowsのコマンドプロンプトから

python ファイル名(改行)

と入力してみてください。

例:python helloworld.py

参考URL:http://docs.python.jp/2.5/tut/node4.html

QThunderbird 「後で送信」の設定方法

Thunderbird Ver3.1.16 を使用しようとしてます。
従来は、OutlookExpress を使用していました。

送信トレイに、一時保存しておき、送信ボタンで、一括で送信したいのです。
すみませんが、
設定やアドインがあるのでしたら、御存知方、教えてください。
メール作成画面で、「後で送信(する)」指定があるのは分かりましたが、
その設定を、デフォルトにする方法が分かりません。
よろしくお願いします。

Aベストアンサー

メール作成画面で案が完成したら、メニューの「ファイル」>「後で送信」を選択すると「ローカルフォルダ」の共通送信トレイに置かれます。
複数の送信メールが置かれた「送信トレイ」の右クリック>「未送信メッセージを送信」から一括送信できます。

また、デフォルトの上の方法で対応できますが、送信予約が可能なSend Later3がありますから、必要でしたら試してみてください。
http://www.thunderbird-mail.net/addon/automail.html
https://addons.mozilla.org/ja/thunderbird/addon/send-later-3/

なお、余計なことですが、3.1バージョンは、3.1.17が最新ではないかと思いますので、ヘルプメニューからの更新をどうぞ。

QBCPユーティリティの使用法_ヘッダー情報の取得_

どなたかご存知の方教えてください。
bcp ユーティリティから、SQLサーバーのテーブルのファイルエクスポート(.txt)は出力できたのですが、データ列名が取得できていませんでした。
列名を取得することは可能なのでしょうか?
可能な場合、.fmt のファイルで設定するのでしょうか?
よろしくお願いします。

Aベストアンサー

キーワード「bcp 列名」でGoogle検索すると4番目に次のページがヒットしました,ご参考まで。
http://d.hatena.ne.jp/w650/20080215/p2

Q送信元アドレスを自由に設定できるメール送信専用ソフト。

送信元アドレスを自由に設定できるメール送信専用ソフトを探しています。パソで送信元のアドレスも携帯のメアドに偽装できるやつです。よろしくお願いしますm(_ _)m

Aベストアンサー

念のため、やり方も置いていきますね。

あくまで送信元の偽装なので、そのアドレスにメールを送っても届きません。

ツール→アカウント→メール→追加→メール

表示名:相手に表示させたい自分の名前
電子メールアドレス:相手に表示させたいアドレス
受信メールサーバー:なんでもよし(私はわかりやすくnothingとかにしてます)
送信メールサーバー:あなたがPCで使っているメールアドレスの送信サーバー
アカウント:なんでもよし(適当に@の前とかでいいです)
パスワード:なんでもよし(保存するのチェックを外せば空欄でいい)
で、完了。

その後、ツール→アカウント→メール→該当アカウント(受信サーバーが表示されてます)をダブルクリック
全般→一番上のボックスに受信サーバーが表示されていますが、これをわかりやすい物に変えましょう
一番下の受信時および同期時にこのアカウントを含むのチェックを外しましょう。
OKで完成。

メールを送るときに送信者をこのアカウントに変更して送れば、偽装アドレスで送信できます。

QPythonでcall_user_funcを行う

お世話になります。

最近Pythonの勉強を始めた初心者です。
GAE/Python2.5で、PHPで言うcall_user_funcを使う方法を探しております。
具体的に言いますと、関数名(メソッド名)を変数に入れて、それを呼び出す方法を探しています。

例えばPHPで言えば下記のようなコードです。
----------------------
<?php
// 呼び出すクラス
class CTestClass
{
  // 呼び出すメソッド
  function TestFunc()
  {
    echo 'Call <CTestClass::TestFunc()>';
  }
}

// 変数にメソッド名を入れて呼び出す
$func = 'TestFunc';
$obj = new CTestClass();

call_user_func( array( $obj, $func ) );
// print Call <CTestClass::TestFunc()>
----------------------

Pythonでは上記のような事は可能でしょうか?
また、メソッドを呼び出すのと普通のグローバル関数を呼び出すのでやり方が違う場合はそちらも教えて頂けるとあり難いです。

以上、よろしくお願い致します。

お世話になります。

最近Pythonの勉強を始めた初心者です。
GAE/Python2.5で、PHPで言うcall_user_funcを使う方法を探しております。
具体的に言いますと、関数名(メソッド名)を変数に入れて、それを呼び出す方法を探しています。

例えばPHPで言えば下記のようなコードです。
----------------------
<?php
// 呼び出すクラス
class CTestClass
{
  // 呼び出すメソッド
  function TestFunc()
  {
    echo 'Call <CTestClass::TestFunc()>';
  }
}

// 変数にメソッド名を入れて呼び出す
$func = ...続きを読む

Aベストアンサー

PHPは知らないけどPythonなら

def func(a,b,c):
 ...
x=func
x(a,b,c)
くらいで書けると思うけど。
あと、Pythonではクラスのメソッドは最初の引数がselfな関数に過ぎないから、関数形式の呼び出しを使うなら気にしなくて良い。
具体的には
class A:
 def f(self,b,c):
  ...
A a
と定義すると
a.f(b,c)
でも
f(a,b,c)
でも呼び出し可能になる。

Q複数のアカウントでどちらからでも送信可能な設定にするには?

メールのアカウントを2つ併用してます。
受信時は設定でどちらから接続しても双方とも受信できるのですが、
送信の際もどちらから接続しても送信出来るようにしたいのですが
設定が分かりません。どなたか教えて頂けませんか?

Aベストアンサー

はずしていたらすいません。
私も複数のプロバイダで4つのアカウントを
家族で使用しています
私の場合は、CATVのプロバイダで常時接続しており
フリーのメールソフトを使用していて特に接続先を切り
かえることはありませんが、それぞれを問題なく送受信
していますよ。
お使いのメーラーが分からないのでなんとも言えませんが
以前私がOEを使っていたとき、受信はどちらでもでき
ましたが送信についてはアカウントをいちいち設定して
面倒でした。 (ただ私が知らないだけで他の設定方法
があるかもしれませんが)
1度他のメール・ソフトを検討されてみてはいかがですか?
私は Edmax と言うフリーソフトを使っていますが
フリーとは思えないくらいの優れものです。
以下のURLからダウンロードできますので試してみて下さい。

参考URL:http://www.edcom.jp/

Q同じネタですみません。m(_ _ X)m スクリーンセーバー

FLASHでスクリーンセーバーを作るソフト(フリーで)をダウンロードできるサイトを探しています。

Aベストアンサー

普通にフラッシュだけ作成配布して、
↓みたいなソフトでSS化して貰えばいいんじゃない?

参考URL:http://www.google.com/search?hl=ja&q=FLASH%E3%80%80%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%BB%E3%83%BC%E3%83


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング