ページ 11

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

Posted: 2015年10月13日(火) 22:14
by MoNoQLoREATOR
こんばんは。
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環境だからでしょう。
これを解決する方法を探した方が良いのでしょうか?
また、受信パッケージのサイズを素直に取得する方法は存在しないのでしょうか?

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

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

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

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

Posted: 2015年10月16日(金) 21:25
by MoNoQLoREATOR
やはりそういった手段を取るしかないのですね。
ありがとうございました。