• ベストアンサー

APIのみでUDPってできますか

実をいうとCではなくVBなのですが・・・。 VBのWinsockは挙動不審だし、VBからCSocketは使えないので、APIのみでIP=xxx.xxx.xxx.xxxのポートyyyyになんか送るって関数ありませんでしょうか?

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

できますよ。 Socketコントロールを使わずにWinSockを直接呼び出せば可能です。 ・WinSock初期化 Public Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequested As Long, lpWSAData As WSADataType) As Long ・WinSock終了 Public Declare Function WSACleanup Lib "wsock32.dll" () As Long ・Socket生成 Public Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal lngType As Long, ByVal protocol As Long) As Long ・Socket廃棄 Public Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long ・UDP送信 Public Declare Function sendto Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLen As Long, ByVal flags As Long, sTo As sockaddr, ・UDP受信 Public Declare Function recvfrom Lib "wsock32.dll" (ByVal s As Long, buf As Any, ByVal lngLen As Long, ByVal flags As Long, from As sockaddr, fromlen As Long) As Long ・バイトオーダー変換 Public Declare Function htonl Lib "wsock32.dll" (ByVal hostlong As Long) As Long Public Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Integer Public Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long Public Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Integer マルチスレッドアプリケーションであれば以上のAPIで実現可能と思われます。 シングルスレッドアプリケーションの場合は非同期APIを使う必要があるので多少ややこしくなります。

haporun
質問者

お礼

回答ありがとうございます。 これらのAPIを使って一通りやってみました。 しかし、戻り値がエラーでないにも関わらず、届いていないのは、VBがシングルスレだからなのでしょうか・・・。 バイトオーダー変換というのは・・・。 IPのa.b.c.dをd.c.b.aに入れ替える? それともビット順入れ替え?

その他の回答 (1)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

> バイトオーダー変換というのは ホストバイトオーダーをネットワークバイトオーダーに、もしくはその逆を行います。 2,4バイト単位で意味を持つデータ(通常は整数)のバイト並びを標準化します。 ホストバイトオーダー: 2バイト整数0x0001を例にとると intel系CPU→メモリ上では0x01,0x00と並ぶ motorola系CPU→メモリ上でも0x00,0x01と並ぶ ネットワークバイトオーダー: 異機種間での通信でバイトオーダーがネックとならないように、ネットワークにおけるバイトオーダーは規約によって統一される 2バイト整数0x0001を例にとると CPUに関係なく→0x00,0x01と並ぶ htons()→ホストバイトオーダーの2バイトをネットワークバイトオーダーへ htonl()→ホストバイトオーダーの4バイトをネットワークバイトオーダーへ ntohl()→ネットワークバイトオーダーの2バイトをホストバイトオーダーへ ntohl()→ネットワークバイトオーダーの4バイトをホストバイトオーダーへ ポート番号もネットワークバイトオーダーなので注意してください。 UDPにおける通信では送信完了(=エラー無し)が受信完了ではありません。 「単に送信が終わった」だけで、受信が正常かどうかについては確認する手段がありません。 受信側が「受信オッケー」だったことを報告する送信を行うことで送信側に完了を通知するのが王道です。 送信側    受信側 MSG送信 → MSG受信 RES受信 ← RES送信 ポート番号をホストバイトオーダーで設定してしまった場合、受信側ではポート番号が違うのでパケットを受け取れませんが送信側にエラーは報告されません。

haporun
質問者

お礼

回答ありがとうございます。 非常に申し訳ないのですが、VBのWinsockコントロールの挙動不審の原因がやっとわかったので、結局そっちでいきたいと思います。 ちなみに、教えてくださった方法も、バイトオーダー変換を通すと、成功しました。