UDPでの送信処理

解決


GOジャグ  2005-01-25 19:35:47  No: 56174  IP: [192.*.*.*]

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

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

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-25 21:40:17  No: 56175  IP: [192.*.*.*]

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-25 22:32:45  No: 56176  IP: [192.*.*.*]

int はうにっくす互換?

編集 削除
GOジャグ  2005-01-25 22:59:01  No: 56177  IP: [192.*.*.*]

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がでたのでキャストしたんですが
受けるほうを変えるべきでした。

編集 削除