udp通信につまづいている

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
8492飛行隊

udp通信につまづいている

#1

投稿記事 by 8492飛行隊 » 13年前

udp通信で

チャットプログラム(テスト)を作っています。

とりあえずテストとして自分のipアドレスに送信できるか調べています。

送信するメッセージは HELLO です。

で調べていたところ 送信先のipアドレスを127.0.0.1にするとちゃんと受信されるのですが、

自分のipアドレスを入れると受信できません。

何が原因なのでしょうか。

よろしくお願いします。


送信側ソースコード

コード:

#pragma comment(lib, "ws2_32.lib")
#include <winsock2.h>

int
main()
{
 WSAData wsaData;

 SOCKET sock;
 struct sockaddr_in addr;

 WSAStartup(MAKEWORD(2,0), &wsaData);

 sock = socket(AF_INET, SOCK_DGRAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(80);
 addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

 sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

 closesocket(sock);

 WSACleanup();

 return 0;
}

受信側ソースコード

コード:

#pragma comment(lib, "ws2_32.lib")
#include <stdio.h>
#include <winsock2.h>

int
main()
{
 WSAData wsaData;

 SOCKET sock;
 struct sockaddr_in addr;

 char buf[2048];

 WSAStartup(MAKEWORD(2,0), &wsaData);

 sock = socket(AF_INET, SOCK_DGRAM, 0);

 addr.sin_family = AF_INET;
 addr.sin_port = htons(80);
 addr.sin_addr.S_un.S_addr = INADDR_ANY;

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

 memset(buf, 0, sizeof(buf));
 recv(sock, buf, sizeof(buf), 0);

 printf("%s\n", buf);

 closesocket(sock);

 WSACleanup();

 return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: udp通信につまづいている

#2

投稿記事 by softya(ソフト屋) » 13年前

自分自身のローカル/グローバルIPには送信できません。
こういうテストをするにはローカル/グローバルIPが2つ必要です。つまり2つのPCが必要です。
あるいは、VMwarePlayer等で仮想PCのローカルIPを割り当てて、そのPC間とで通信する必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Poco
記事: 161
登録日時: 15年前

Re: udp通信につまづいている

#3

投稿記事 by Poco » 13年前

ぱっと見、UDP通信なのにrecv()を使用しているところが気になります。
この場合、送信側でconnect()する必要があった気がします。
もしくはrecv()を止めて、recvfrom()を使用してみてはどうでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: udp通信につまづいている

#4

投稿記事 by みけCAT » 13年前

softya(ソフト屋) さんが書きました:自分自身のローカル/グローバルIPには送信できません。
自分自身のローカルIPアドレスには(自分の環境では)送信できました。
使用したのはUDP/IPテストツール 2.22です。
添付ファイル
udp_test.jpg
証拠画像です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

8492飛行隊

Re: udp通信につまづいている

#5

投稿記事 by 8492飛行隊 » 13年前

softyaさん<なるほど自分自身には無理なのですか。初めて知りました。

ぽこさん<ご指摘ありがとうございます。改善しました。

みけCATさん<便利なツールの紹介ありがとうございました。早速ダウンロードしてしまいました。


ちなみに知恵袋で UDPはインターネット越し

に送信できないと書いてありましたが

そんなことはありませんよね。

あとルータがある場合でも大丈夫なのでしょうか。

実験環境がなくて困っています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: udp通信につまづいている

#6

投稿記事 by softya(ソフト屋) » 13年前

8492飛行隊 さんが書きました:softyaさん<なるほど自分自身には無理なのですか。初めて知りました。

ぽこさん<ご指摘ありがとうございます。改善しました。

みけCATさん<便利なツールの紹介ありがとうございました。早速ダウンロードしてしまいました。


ちなみに知恵袋で UDPはインターネット越し

に送信できないと書いてありましたが

そんなことはありませんよね。

あとルータがある場合でも大丈夫なのでしょうか。

実験環境がなくて困っています。
すいません。グローバルIPだと自分自身に接続できない出来ないってのが正しいですね。

あとUDPで相手に通信するには相手側のルータのポートを開けて貰う必要があります。
これは難易度が高くなるので自動的に内部からポート開けるuPnPを使います。
PS3とかXbox360のゲーム機でも実装されている機能ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

8492飛行隊

Re: udp通信につまづいている

#7

投稿記事 by 8492飛行隊 » 13年前

ありがとうございます。

すべての疑問が解決してすっきりしました。

皆様のおかげです。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る