UDPでの送信処理

解決


GOジャグ  2005-01-26 04:35:47  No: 56174

ごめんなさい文字化けしてしまいました。

たびたびお世話になってます。

UDPでのソケット通信で送信処理についての質問です。

クライアント側から送信するときにsendtoを使っています。
sendtoで送信するとエラーになってしまいます。
sendtoの戻り値はー1
WSAGetLaseErrorの値は10047になっています。
10047をMSDNで調べたらTCP通信と混同してる
ようなことが書かれてありました。
ただ、何が悪いのか分かりません。

//ソケット生成
iSock = (int)socket( AF_INET, SOCK_DGRAM, 0 );
//送信サイズ設定
setsockopt((SOCKET)iSd,SOL_SOCKET,SO_SNDBUF,(char*)&size,sizeof(size));
//受信サイズ設定
setsockopt((SOCKET)iSd,SOL_SOCKET,SO_RCVBUF,(char*)&size,sizeof(size));
//ポート再使用属性付加
setsockopt( (SOCKET)iSd, SOL_SOCKET, SO_REUSEADDR, (char*)&flagset,sizeof( flagset ) );

sendtoの前に上記の処理をしています。
全てエラーにはなっていません。

開発環境は
VC++.NET
Windows2000です。
また、同一のパソコンで別EXEとして
サーバとクライアントを動かしています。

宜しくお願いします。


YuO  2005-01-26 06:40:17  No: 56175

WSAEAFNOSUPPORTのエラー原因の一つに,
> an address of the wrong family is used for a socket
なんて記述がありますが,これは大丈夫ですか?
http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp?FRAME=true#winsock.wsaeafnosupport_2

sockaddr_in::sin_familyがAF_INETでないとか……。

ところで,SOCKETをintにキャストするのはやめた方がよいです。
WinSockのソケットはNT Kernel Objectになっています。
#WinNT系の場合
ということで,64bit環境において,ソケットハンドルは64bitになります。
何らかの理由があるなら別ですが,わざわざ警告・エラーの種を残す必要はないかと。


浅慮  2005-01-26 07:32:45  No: 56176

int はうにっくす互換?


GOジャグ  2005-01-26 07:59:01  No: 56177

YuOさんありがとうございます。

>sockaddr_in::sin_familyがAF_INETでないとか……。

sin_familyはAF_INETになっていました。
ただ、指摘のおかげでsockaddr_in関連を
調べなおしたらsockaddr_inをポインタで渡して
sendtoの前でサイズをsizeofで取得してました。
ポインタなので4バイトになっていてエラーになっていました。

>ところで,SOCKETをintにキャストするのはやめた方がよいです。
>WinSockのソケットはNT Kernel Objectになっています。
>#WinNT系の場合
>ということで,64bit環境において,ソケットハンドルは64bitになります。
>何らかの理由があるなら別ですが,わざわざ警告・エラーの種を残す必要はないかと。

そうですね。キャストするのはやめます。
Linuxのなごりでintにしていました。
Warningがでたのでキャストしたんですが
受けるほうを変えるべきでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加