• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:winsockを使った通信方法)

winsockを使った通信方法

このQ&Aのポイント
  • #winsock #通信方法 #送信側 #受信側 #UDP通信
  • winsockを使ったUDP通信で構造体データを送る際に問題が発生しています。コンパイルは通っていますが、送信側でデータを送信しても受信側で受け取ることができません。どこに誤りがあるのでしょうか?
  • winsockを使用したUDP通信プログラムで構造体データを送る際に問題が発生しています。送信側のコンパイルは通っていますが、受信側でデータを受け取ることができていません。どの部分に誤りがあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.5

>ちゃんと初期化しなかったのが原因であってますか? 原因の一つではありますが、それが全てではありません。 大本の原因は不適切な関数の使用でしょう。 >strcat(send.Name, "ABC"); strcat()ではなくstrcpy()を使うべきではありませんか? 上から順にコードを読んだ人は、ここでstrcat()を使用することに違和感を覚えるでしょう。 連結ってことはここより前になにか文字列を設定しているハズ。 ということはコードの見落としがあったのか?確かめないと。 見落としはなかった、文字列の設定もされていないのになんで連結なんだろう? define定義で関数コールが隠蔽されていたのかも知れない。そっちも確認しないと。 などなど。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>送信側のバグと言うのは 単純なミスでしょうか? >それとも 知識不足でミスを犯しているのでしょうか? ・ただのタイプミス ・元々使うつもりだった関数と似てる関数名のものを間違って使用した ・関数の仕様を微妙に勘違いしていた など色々考えられます(上記にはヒントっぽいもの入ってます)。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>addr.sin_family = AF_INET;では確かに2が代入されていたので。 >sendto 内がおかしいのがわかりました。 sendto()がおかしいのではなく、sendto()が期待する値が入っていないのがおかしい…んですけどね。 addr.sin_family = AF_INET; から sendto()までの間をステップ実行(あるいはprintf()でaddr.sin_familyの値を表示)していけば、 どこで壊されたのか? というのは特定可能なハズです。 スパっと答えを書いてもいいのでしょうけど、それだといつまで経っても自分でデバッグする技術が身に付きませんしね。 >送信側のバグと言うのは 単純なミスでしょうか? >それとも 知識不足でミスを犯しているのでしょうか? まぁ、単純なミスが重なっただけ…でしょう。 未初期化のローカル変数の値がどうなっているのか? とか、使用する関数は適切か?という。

who_ray_sis
質問者

補足

memsetで構造体内のchar型の変数を0で埋めてみると うまくいきました。 ちゃんと初期化しなかったのが原因であってますか?

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

http://www.geekpage.jp/programming/winsock/udp.php で「エラー処理は省いてあります。 実際にコードを書く場合にはエラー処理も行ったコードにして下さい。 」と書かれていますよね? で、エラー処理しましたか? >sendto(sock,(char *)&send,len, 0, (struct sockaddr *)&addr, sizeof(addr)); が正常終了を返しましたか? 私の手元では-1が返却され、GetLastError()してみたらWSAEAFNOSUPPORTが返されました。 「指定したファミリのアドレスはこのソケットでは使用できません。」 となります。 addr.sin_family = AF_INET; で設定しているにも関わらずそんなエラーが出るのはおかしい!! ということで、sendto()でブレークして値を確認してみます。 ws2def.hで #define AF_INET 2 となっているので2が設定されているハズですが、全然違う値が設定されています。 ということは、どこかで破壊するコードが紛れ込んでいる事になります。 では、どれが???? って感じでデバッグして下さい。 # まさに指摘されている送信側のバグだったりしますけどね。

who_ray_sis
質問者

補足

AF_INETに定義されている2ではなく16642という値が sendtoのaddr.sin_familyに入っていました。 addr.sin_family = AF_INET;では確かに2が代入されていたので。 sendto 内がおかしいのがわかりました。 送信側のバグと言うのは 単純なミスでしょうか? それとも 知識不足でミスを犯しているのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「送信側を起動しても受信側で受け取ることが出来ていない状況」とは, 具体的にはどう「できていない」んですか? # とりあえず送信側のバグには目をつむることとして.