ごめんなさい文字化けしてしまいました。
たびたびお世話になってます。
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として
サーバとクライアントを動かしています。
宜しくお願いします。
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になります。
何らかの理由があるなら別ですが,わざわざ警告・エラーの種を残す必要はないかと。
int はうにっくす互換?
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がでたのでキャストしたんですが
受けるほうを変えるべきでした。
ツイート | ![]() |