• 締切済み

[winsock]多分レベル低い質問です

インターネット越しにマシン間でUDPのテストをすべく、 http://www.geekpage.jp/programming/winsock/udp.php の受信プログラムと送信プログラムをまるまるコピーして、その後送信プログラムをちょっといじりました。 まず setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(const char *)&TorF,sizeof(BOOL)); を追加し、 addr.sin_addr.S_un.S_addr = INADDR_BROADCAST; としました。 (TorF変数はBOOL型変数でTRUEで初期化してあります) そして送信プログラムと受信プログラムを別のマシン上に置いて、まず受信プログラムを起動して、送信プログラムを実行しましたが、受信側ではrecv関数待ちが続くだけで、いっこうにデータを受信できません。 備考: ローカルでテストを行ったところ、問題なく受信できました。 ブロードキャストでなく、直接IPを指定してマシン間で送受信をしても、やはりrecv関数でとまってしまいます。 そこで質問ですが、winsockを使用して別のPC間でUDP通信を行う場合、これ以外に設定が必要なのでしょうか。

  • ggaogg
  • お礼率86% (209/243)

みんなの回答

  • passepied
  • ベストアンサー率50% (18/36)
回答No.1

パーソナルファイアウォールの設定や中継するルーターでパケットが通るようになっているか確認されていますでしょうか。

ggaogg
質問者

お礼

TCPソケット通信で別のコンピュータ同士でconnect→データ送信ということはできたのですが、それとこれとはファイアウォールやルータの設定においてまた別の話なのでしょうか? もしそうだとしたら、設定してないです・・。 設定のしかた調べてみます。

関連するQ&A

  • Winsock

    チャットプログラムを作りたく思い、初めてWinsockプログラミングにとりかかることになりました。 ログイン時に存在を知らしめるため、RemoteHostプロパティ???.???.???.255(じぶんちねっと)相手にUDP15500ポートに文字列を送信します。 マシンA UDP15500で待ち状態 マシンB UDP15500で待ち状態 マシンA ???.???.???.255のUDP15500に文字列送信 マシンA 受信 マシンA 送信 マシンA 受信 マシンA 送信 マシンA 受信 ・・・何度やっても同じ。 マシンB 送信 マシンA 受信 マシンB 受信 ・・・ここでなぜか両方受信できる。 マシンA 送信 マシンB 受信 マシンA 送信 マシンB 受信 マシンB 送信 マシンA 受信 マシンB 送信 マシンA 受信 マシンB 送信 マシンA 受信 ・・・・ 最初は自分で送ったメッセージを自分が受信してるだけなのですが、そこでもう片方がメッセージを送ると両方が受信します。 その後、どちらがメッセージを送っても、もう片方に届くだけで、自分には届きません。 しかし、両方のプログラムを再起動すると、また、同じ動作が最初から確認できます。 これはいったい、何が原因でこういうことになってるんでしょう。 もう1つ質問があります。 このようなサーバーを必要としないようなチャットプログラムのようなものを作るとき、そもそもUDPを使っていいのか、ポートは何番を使っていいのかとか、教えてもらえませんか?

  • winsockを使った通信方法

    送信側 #include <winsock2.h> #include <string.h> int main() { WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; typedef struct recv { char Name[32]; int Flag; } RECV; RECV send; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); strcat(send.Name, "ABC"); send.Flag=12; len=sizeof(send); sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); closesocket(sock); WSACleanup(); system("pause"); return 0; } 受信側 #include <stdio.h> #include <winsock2.h> #include <string.h> int main() { typedef struct rcv { char Name[32]; int Flag; } RECV; WSAData wsaData; SOCKET sock; struct sockaddr_in addr; int len; RECV rcv; WSAStartup(MAKEWORD(2,0), &wsaData); sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.S_un.S_addr = INADDR_ANY; bind(sock, (struct sockaddr *)&addr, sizeof(addr)); len=sizeof(rcv); recv(sock,(char *)&rcv, len, 0); printf("%s [%d]\n",rcv.Name,rcv.Flag); closesocket(sock); WSACleanup(); system("pause"); return 0; } winsockを使ったUDP通信プログラムで構造体データを送る事が出来ないのですが どこに誤りがあるのでしょうか? コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。

  • winsockを使ったTCP及びUDP通信について

    今回winsockを使った通信プログラムを組む事になったのですが、わからない点が多々ありましたので、どなたかご教授頂けると大変ありがたいです。 1. TCP通信において、送信側が"Hoge" "Fuga"と2回sendした際、受信側でrecvすると"Ho" "geFu" "ga"と3回受信する可能性があると認識しているのですが、これは正しいでしょうか? (到着する順序は保証されるが、recvする際に送信側がどのようにsendしたかは考慮されない) 2. UDP通信においては、上記のような現象は起きないと認識しているのですが、これは正しいでしょうか? (UDP通信では、2回sendすれば2回以上はrecvしない。パケットの破棄はあっても、分割はない) 3. もしUDP通信でも上記のような現象が起きる場合、到着順序の保証がされないという観点から、recvした際に"Ho" "ga" "geFu"と受信する事はあり得るのでしょうか? 4. 2が正しい前提での話です。UDP通信では、MTUを超えた場合、自動でパケットが分割されると聞きました。プログラムを組む際、これは意識しないといけないのでしょうか? (MTUが1500Byteの場合、UDPで2000Byteをsendすると、recvで1500,500と2回受信する?) 以上の4点です。 どなたかご存知の方いらっしゃいましたら、是非ご教授ください。

  • Winsockを利用した単純なファイル送信プログラムについて

    こんばんは。 何度もこの掲示板を利用させていただいている者です。 WinsockのUDPを用いて簡単なファイル送信プログラムを作っています。UDPを使わずに、TCPを使用したほうが良いのでは?とのご指摘をいただきましたが、まずは、UDPを利用した単純なファイル送信プログラムを作ってみたいと思っています。 しかし、送信側から受信側へファイルがうまく受信できていません。もしかしたら、送信側自体がきちんと送信できていないのかもしれません。 以下にそのプログラムの概要と内容を示します。 [概要] 送信側→受信側にUDPを用いて、送信側にあるjpegまたはmpegファイルを送信し、受信側でファイルを開く。 [プログラム概要] ・送信側 ファイルポインタを用いてファイルオープン fread関数とsendto関数を用いて1024バイトずつ送信 ・受信側 ファイルポインタを用いてファイルオープン whileの無限ループ内に、recvfrom関数とfwrite関数を用いて送信側からのデータを受信 [プログラムの内容] ・送信側 printf("読み込み用ファイルを入力して下さい:"); scanf("%s",fname); if((fp = fopen(fname,"rb")) == NULL){ printf("入力ファイルをオープンできない。\n"); exit(1); } char send_buf[1025]; int n; while(n = fread(send_buf,1,1024,fp) != -1){ sendto(theSocket,send_buf,n,0,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); } ・受信側 char Recv_buf[1025]; char size; SOCKADDR_IN saClient; while(1){ size = recvfrom(theSocket,Recv_buf,1024,0,(LPSOCKADDR)&saClient,&nLen); fwrite(Recv_buf,size,1,fp); } ご指摘またはご教授をいただけたらと思います。 よろしくお願いします。

  • winsockで複数のLANカードを使用するには

    winsock初心者です。 TCPまたはUDPにて1枚のLANカードで通信するプログラムはよくあるのですが 複数のLANカードで通信する場合の参考プログラムがありません。 具体的には, UDPクライアントを作成する場合,指定したLANカード(IPアドレス)に生成したsocketとリンクして通信させたいのです。 bind()のsockname.sin_addr.s_addrにてINADDR_ANYではなくカードに設定したIPアドレスを設定すればよいのでしょうか? 同じ疑問がTCPクライアント作成でもあります。 この場合bind()ではなく,connect()で送信したいカードに接続されるサーバー側のIPアドレスを指定するということでしょうか? また2枚のカードを使用する場合,同じネットワークアドレス(192.168.0.XXX)は使用しない方が良いのでしょうか?(UDPブロードキャストだと両カードで送信してしまう?) 色々調べてますがこれだという回答がみつかりません 誰かご存知でしたら御教示願います。

  • 延々と受信し続けるwinsockのrecv

    以下のサーバープログラムを用いて、 (acceptしたらスレッド作成し、作成が終ったということをクライアントに知らせるために文字列送信後受信待機している) #include <winsock2.h> #include <vector> #include <process.h> #include <algorithm> char *Ver = "0.00"; using namespace std; unsigned __stdcall Patch( void *Sock ); int main() { ----WSADATA wsaData; --------WSAStartup( MAKEWORD(2,0), &wsaData ); ----SOCKET RecvSock = socket( AF_INET, SOCK_STREAM, 0 ); ----SOCKET SendSockBuf; ----vector<SOCKET> SendSock; ----fd_set ConnectFds, SubConnectFds; ----struct sockaddr_in Recv, Send; ----int len = sizeof(Send); ----Recv.sin_family = AF_INET; ----Recv.sin_port = htons(55555); ----Recv.sin_addr.S_un.S_addr = INADDR_ANY; --------bind(RecvSock, (struct sockaddr *)&Recv, sizeof(Recv) ); ----FD_ZERO( &SubConnectFds ); --------FD_SET( RecvSock, &SubConnectFds ); ----listen( RecvSock, 5 ); ----vector<unsigned int> thID; ----vector<HANDLE> hTh; ----struct timeval tv; --------tv.tv_sec = 0; --------tv.tv_usec = 0; ----while(1) ----{ --------memcpy( &ConnectFds, &SubConnectFds, sizeof(fd_set) ); --------select( 0, &ConnectFds, NULL, NULL, &tv ); --------if ( FD_ISSET(RecvSock, &ConnectFds) ) --------{ ------------SendSockBuf = accept(RecvSock, (struct sockaddr *)&Send, &len); ------------if( SendSockBuf != INVALID_SOCKET) ------------{ ----------------SendSock.push_back( SendSockBuf ); ----------------thID.push_back( hTh.size() ); ----------------hTh.push_back( (HANDLE)_beginthreadex(NULL, 0, Patch, &SendSock[hTh.size()], 0, &thID[hTh.size()]) ); ------------} --------} ----} ----closesocket(RecvSock); ----WSACleanup(); ----return 0; } unsigned __stdcall Patch( void *Sock ) { ----SOCKET *SendSock = (SOCKET *)Sock; ----send( *SendSock, Ver, 5, 0 ); ----char Str[5]; ----while( Flag == 0 ) ----{ --------recv( *SendSock, Str, 5, 0 ); ----} ----closesocket( *SendSock ); ----return 0; } 以下のようなクライアントプログラムで文字を送信すると、 #include <WinSock2.h> using namespace std; void main() { ----WSADATA wsaData; --------WSAStartup( MAKEWORD(2,0), &wsaData ); ----SOCKET Sock = socket( AF_INET, SOCK_STREAM, 0 ); ----struct sockaddr_in Addr; --------Addr.sin_family = AF_INET; --------Addr.sin_port = htons(55555); --------Addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); ----connect( Sock, (struct sockaddr *)&Addr, sizeof(Addr) ); ----char str[5]; ----recv( Sock, str, 5, 0 ); ----send( Sock, "0.00", 5, 0); ----shutdown( Sock, 2 ); ----closesocket( Sock ); } クライアントプログラムは終了しているのにサーバープログラムは"0.00"を受信し続けます。 どこがおかしいのか分からないので教えてください

  • Winsockのsendto関数のタイムアウトについて

    はじめまして。。。 Winsockのsendto関数を使用してユニキャストでUDP送信 しているのですが、LAN切断時等送信先がない場合、 3秒くらいsendto関数の応答が帰ってこなくて困っています。 setsockoptの「SO_SNDTIMEO」で送信タイムアウトを 設定してみたのですが、状況は変わりませんでした。 もし、LAN切断時でもすぐに応答が帰ってくる方法が ございましたらご教示頂けないでしょうか? 環境 OS:Windows XP 言語:.NET 2003 C++

  • WinSockとWinPcapについて

    いつもお世話になります。 今、UDPパケット送受信ソフトを生成しています。 送信ソフトはWinSockを用いて作成しました。 受信ソフトをWinSockを用いて作成しましたが、 受信パケット数をカウントしようと思い、 recvfrom()でカウントしましたが、正常にカウントされない 保障されないことがWinSockではわかりました。 受信パケット数をカウントするには、 デバイスレベルで(Ethereal/WireShark)で行っている ようにWinPCapを用いると パケットをカウントできるのではないかと考えられます。 WinPcapでパケット受信を行う場合、 送信がWinSockで送信していても問題ないでしょうか? また、WinPcapでパケットを受信するには どうしたらいいのでしょうか? どうぞよろしくお願い致します。

  • Winsockについての質問

    Winsockで、「GET / HTTP/1.1」というリクエストを「127.0.0.1(自分自身)」に送って(サーバーはAPACHE2)ドキュメントルートにある「index.html」を見る。 というプログラムを作ったのですが、受信ができません。 受信できるにはどうすればいいか教えてください。 尚以下がそのプログラムです。 #include<stdio.h> #include<winsock2.h> int main(){ SOCKET hsock; struct sockaddr_in serverOption; char buf[1024]; int Error; int func_Error; WSADATA wsadata; func_Error=WSAStartup(MAKEWORD(2,0),&wsadata); if(MAKEWORD(2,0)!=wsadata.wVersion){ fprintf( stderr, "Winsock version error\n"); return -1; } hsock=socket(AF_INET,SOCK_STREAM,0); if(!hsock){ printf("ソケット作成エラー"); } serverOption.sin_family=AF_INET; serverOption.sin_addr.s_addr=inet_addr("210.81.150.5"); serverOption.sin_port=htonl(80); func_Error=connect(hsock,(struct sockaddr *)&serverOption,sizeof(serverOption)); if(!func_Error){ printf("接続エラー"); } func_Error=send(hsock,"GET / HTTP/1.1",strlen("GET / HTTP/1.1"),0); if(!func_Error){ printf("データが送れない。残念ですた"); } Error=recv(hsock,buf,sizeof(buf),0); if( Error <= 0) { printf("受信不可能"); return -1; } buf[Error]='\0'; printf("%s",buf); closesocket(hsock); WSACleanup(); return 0; }

  • recv関数でフリーズしてしまう

    現在Winsockを用いた簡単なパケット送受信のソフトを作成しています。 開発環境はVisual Studio2008で、ダイアログベースで作成しています。 パケットの受信側の処理なんですが、いつパケットが来てもいいように、 Ontimerで、定期的に受信処理をしようと思っています。 そこでOntimer内に以下のようにプログラムしたところ、コンパイルエラー はないものの、数秒経つと応答なしとなりフリーズしてしまいます。 原因を探ったところrecv関数が原因で、recv関数をコメントアウトした ところ、フリーズはしなくなりました。また、エラー処理は省略していま すが、ソケットの作成失敗などはありませんでした。 なぜrecv関数でフリーズが起きてしまうのか、原因が分かる方は いらっしゃいますか? OnTimer(UINT nIDEvent){ 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(12345); 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); closesocket(sock); WSACleanup(); }