送信側
#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通信プログラムで構造体データを送る事が出来ないのですが
どこに誤りがあるのでしょうか?
コンパイルは通ってるのですが、送信側を起動しても受信側で受け取ることが出来ていない状況です。
No.5ベストアンサー
- 回答日時:
>ちゃんと初期化しなかったのが原因であってますか?
原因の一つではありますが、それが全てではありません。
大本の原因は不適切な関数の使用でしょう。
>strcat(send.Name, "ABC");
strcat()ではなくstrcpy()を使うべきではありませんか?
上から順にコードを読んだ人は、ここでstrcat()を使用することに違和感を覚えるでしょう。
連結ってことはここより前になにか文字列を設定しているハズ。
ということはコードの見落としがあったのか?確かめないと。
見落としはなかった、文字列の設定もされていないのになんで連結なんだろう?
define定義で関数コールが隠蔽されていたのかも知れない。そっちも確認しないと。
などなど。
No.4
- 回答日時:
>送信側のバグと言うのは 単純なミスでしょうか?
>それとも 知識不足でミスを犯しているのでしょうか?
・ただのタイプミス
・元々使うつもりだった関数と似てる関数名のものを間違って使用した
・関数の仕様を微妙に勘違いしていた
など色々考えられます(上記にはヒントっぽいもの入ってます)。
No.3
- 回答日時:
>addr.sin_family = AF_INET;では確かに2が代入されていたので。
>sendto 内がおかしいのがわかりました。
sendto()がおかしいのではなく、sendto()が期待する値が入っていないのがおかしい…んですけどね。
addr.sin_family = AF_INET;
から
sendto()までの間をステップ実行(あるいはprintf()でaddr.sin_familyの値を表示)していけば、
どこで壊されたのか?
というのは特定可能なハズです。
スパっと答えを書いてもいいのでしょうけど、それだといつまで経っても自分でデバッグする技術が身に付きませんしね。
>送信側のバグと言うのは 単純なミスでしょうか?
>それとも 知識不足でミスを犯しているのでしょうか?
まぁ、単純なミスが重なっただけ…でしょう。
未初期化のローカル変数の値がどうなっているのか?
とか、使用する関数は適切か?という。
この回答への補足
memsetで構造体内のchar型の変数を0で埋めてみると
うまくいきました。
ちゃんと初期化しなかったのが原因であってますか?
No.2
- 回答日時:
で「エラー処理は省いてあります。 実際にコードを書く場合にはエラー処理も行ったコードにして下さい。 」と書かれていますよね?
で、エラー処理しましたか?
>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が設定されているハズですが、全然違う値が設定されています。
ということは、どこかで破壊するコードが紛れ込んでいる事になります。
では、どれが????
って感じでデバッグして下さい。
# まさに指摘されている送信側のバグだったりしますけどね。
この回答への補足
AF_INETに定義されている2ではなく16642という値が
sendtoのaddr.sin_familyに入っていました。
addr.sin_family = AF_INET;では確かに2が代入されていたので。
sendto 内がおかしいのがわかりました。
送信側のバグと言うのは 単純なミスでしょうか?
それとも 知識不足でミスを犯しているのでしょうか?
No.1
- 回答日時:
「送信側を起動しても受信側で受け取ることが出来ていない状況」とは, 具体的にはどう「できていない」んですか?
# とりあえず送信側のバグには目をつむることとして.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
atoi( ) の反対をやりたい
-
テキストデータをそのままバイ...
-
下記のプログラムがコンパイラ...
-
_TCHAR*での引数の読み込み
-
C言語のfor文です。 繰り返しの...
-
str系関数を使わずに二つの文字...
-
至急!C言語文字列置換
-
C言語の入力した文字を反転させ...
-
型変換
-
charからLPTSTRへの変換方法
-
strlen関数と同じ働きをする関...
-
'const char *' 型は 'char *' ...
-
C言語 ミリ秒を日付に変換には
-
文字列から空白を取り除きたい...
-
C言語 共用体について コマンド...
-
C言語 文字列操作
-
c言語プログラミング実行時エラ...
-
間接参照のレベルが異なっています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報