2016-07-12 28 views
-2

通常、任意のサイズのパケットを送信する場合、最大値が確立され、受信バッファのサイズとして使用されます。この擬似的な例では受信パケットの実際のサイズを取得する

#include <winsock2.h> 

// Socket Description 
// Hint.ai_family = AF_INET; 
// Hint.ai_socktype = SOCK_DGRAM; 
// Hint.ai_protocol = IPPROTO_UDP; 

void Send(int Size) 
{ 
    char *Data = (char *)malloc(Size); 
    sendto(Socket, Data, Size, NULL, Result->ai_addr, Result->ai_addrlen) 
} 

void Receive() 
{ 
    const unsigned int MaxDataSize = 1436; 
    char *Data = (char *)malloc(MaxDataSize); 
    recvfrom(Socket, Data, MaxDataSize, 0, (SOCKADDR*)&RecvAddr, &RecvAddrSize); 
} 

が、関係なく、データのサイズがSend()に渡され、私たちのReceive()関数は常に定義された最大サイズでそれを取得します。

どのようにして元の送信パケットサイズを確認できますか?

+0

あなたはどんな種類のソケットなのか、より多くのコンテキストを提供する必要がありますか?あなたが送るデータのサイズは?そしてあなたは 'sendto'と' recvfrom'の結果をチェックしますか?また、これはC++とはほとんど関係がありません(あるいは 'malloc'の代わりに' new'を使用するでしょう)ので、タグを更新してください。タグのスパムは怒られます。 –

+3

* recvfrom()*](http://linux.die.net/man/2/recvfrom)の[* man * page]に相談したことはありますか? – EJP

+2

'recvfrom'はパケットのサイズを返します。 – immibis

答えて

0

MSDN recvfrom() Documentation

エラーが発生していない場合、のrecvfromは、受信されたバイト数を返します。 接続が正常に閉じられた場合、戻り値はゼロです。 それ以外の場合は、SOCKET_ERRORの値が返され、WSAGetLastErrorを呼び出すことによって特定のエラー コードを取得できます。

次に、MSG_PEEKフラグの使用を介して着信データで

覗き見。データはバッファにコピーされますが、 は入力キューから削除されません。その後、関数は、 のデータがソケットにキューイングされた合計量と同じではないrecvfrom (またはrecv)関数への1回の呼び出しで読み取ることができるデータの量を返します。実際に となるデータの量は、recvfrom(またはrecv)関数の1回の呼び出しで読み取られるため、sendまたはsendto関数呼び出しで書き込まれたデータサイズは に制限されています。

これにより、着信パケットを複数のバーストで読み取ることができるようになります。パケットを送信する前にパケットの先頭にサイズ値を追加することができます。しかし、これは聞こえるほど些細なことではありません。

あなたが今までに送信する最も大きなパケットを保持するのに十分なメモリをただ割り振るのではなく、このルートに行くことによるパフォーマンスの向上について質問します。

+0

あなたの質問は "元の送信パケットサイズをどのように確認できますか?"でした。これは、受信バッファのサイズとは何の関係もありません。あなたはその点を見逃してしまった。レシーバに受信バッファをいっぱいにしてもらうことも、パケット全体を読み取ることもできません。入ってくるパケットを複数のバースト期間で読む必要があります。受信バッファのサイズは問題ではありません。 – EML

+1

@EML:あなたの言うことはTCPでは当てはまりますが、UDPでは当てはまりません。 UDPは、 'sendto()'(または接続された 'send()')を使ってメッセージを送信し、 'recvfrom()'(または 'recv()')完全なメッセージを読み取り、フルサイズを返します。バッファが単一の読み込みで完全なメッセージを受け取るのに十分な大きさでない場合、 'WSAEMSGSIZE'エラーが報告され、' MSG_PEEK'が使われない限り、メッセージは失われます。 UDPメッセージのペイロード内に実際のメッセージ長を埋め込む必要はありません。 –

+0

@Remy - 私はUDP/DGRAMのコメントに感謝しませんでした - ありがとう - 答えは取り下げました。 – EML

関連する問題