ページ 11

udp通信につまづいている

Posted: 2012年7月12日(木) 17:44
by 8492飛行隊
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;
}

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

Posted: 2012年7月12日(木) 18:08
by softya(ソフト屋)
自分自身のローカル/グローバルIPには送信できません。
こういうテストをするにはローカル/グローバルIPが2つ必要です。つまり2つのPCが必要です。
あるいは、VMwarePlayer等で仮想PCのローカルIPを割り当てて、そのPC間とで通信する必要があります。

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

Posted: 2012年7月12日(木) 21:10
by Poco
ぱっと見、UDP通信なのにrecv()を使用しているところが気になります。
この場合、送信側でconnect()する必要があった気がします。
もしくはrecv()を止めて、recvfrom()を使用してみてはどうでしょうか?

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

Posted: 2012年7月13日(金) 15:44
by みけCAT
softya(ソフト屋) さんが書きました:自分自身のローカル/グローバルIPには送信できません。
自分自身のローカルIPアドレスには(自分の環境では)送信できました。
使用したのはUDP/IPテストツール 2.22です。

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

Posted: 2012年7月13日(金) 19:35
by 8492飛行隊
softyaさん<なるほど自分自身には無理なのですか。初めて知りました。

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

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


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

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

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

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

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

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

Posted: 2012年7月13日(金) 20:52
by softya(ソフト屋)
8492飛行隊 さんが書きました:softyaさん<なるほど自分自身には無理なのですか。初めて知りました。

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

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


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

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

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

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

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

あとUDPで相手に通信するには相手側のルータのポートを開けて貰う必要があります。
これは難易度が高くなるので自動的に内部からポート開けるuPnPを使います。
PS3とかXbox360のゲーム機でも実装されている機能ですね。

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

Posted: 2012年7月13日(金) 21:11
by 8492飛行隊
ありがとうございます。

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

皆様のおかげです。

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