[Winsock2]受信パケットサイズの取得について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

[Winsock2]受信パケットサイズの取得について

#1

投稿記事 by MoNoQLoREATOR » 8年前

こんばんは。
Winsock2を使ってネットワークプログラミングをしているのですが、受信パケットサイズを取得する良い方法が見つかりません。
現在は次のような方法で取得しています。

コード:

int get_received_bytes(SOCKET & sock)
{
	Bindata buffer;
	buffer.set_size(2048);
	int received_bytes;

	while (true)
	{
		received_bytes = recvfrom(
			sock,
			buffer.buffer(),
			buffer.bytes(),
			MSG_PEEK,
			NULL,
			NULL);

		const int error = -1;
		const bool succeeded = received_bytes != error;
		if (succeeded)
		{
			return received_bytes;
		}

		const int buffer_overflow = 10040;
		if(WSAGetLastError() == buffer_overflow)
		{
			buffer.set_size(buffer.bytes() * 2);
			continue;
		}

		return error;
	}

	return received_bytes;
}
あまり効率が良い取得方法とは言えませんね。
recvfromのときにMSG_PEEK|MSG_TRUNCを指定する方法を思いつきましたが、エラーが発生し、WSAGetLastErrorの戻り値が10045(Operation not supported.)でした。Windows環境だからでしょう。
これを解決する方法を探した方が良いのでしょうか?
また、受信パッケージのサイズを素直に取得する方法は存在しないのでしょうか?

どうぞよろしくお願いいたします。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: [Winsock2]受信パケットサイズの取得について

#2

投稿記事 by YuO » 8年前

UDP Datagramのサイズを取得する方法は用意されていないので,
  • 通信プロトコル上,サイズがわかるようにする (固定サイズのパケットのみを通信する等)
  • Datagramの先頭付近にサイズを含めておいて,PEEKした時に取得する
  • IPv4のUDPは高々64Ki Octetなので,最初からそれだけのサイズを確保してしまう (通信プロトコル上の制限があるならその値を利用)
というのが素直な実装かと。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

Re: [Winsock2]受信パケットサイズの取得について

#3

投稿記事 by MoNoQLoREATOR » 8年前

やはりそういった手段を取るしかないのですね。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る