2

SDL_netソケットAPIを使用してサーバーとクライアントを作成しています。文字列バッファは簡単に読み取れますが、16進データを送信しようとすると、recvが長さを取得しますが、バッファの内容を読み取れないようです。

IPaddress ip;
TCPsocket server,client;
int bufSize = 1024;
char message[bufSize];
int len;

server = SDLNet_TCP_Open(&ip);
client = SDLNet_TCP_Accept(server);
len = SDLNet_TCP_Recv(client,message,bufSize);

これがスニペットです。バッファ長「len」が設定されていますが(つまり、メッセージ長)、メッセージバッファのデータ内容を取得できません。一部のサンプルbind_transmitterPDUデータは、ランダムクライアントによってそのポートのサーバーに送信されました。PDU(SMPP)が読み取れません。

4

3 に答える 3

1

C++ でこのスニペットを使用して、以前にバッファーに保存された 16 進ストリームのフォーマットされていないダンプを取得します。

#include <ctype.h>
#include <stdio.h>
void hexdumpunformatted(void *ptr, int buflen) {
  unsigned char *buf = (unsigned char*)ptr;
  int i, j;
  for (i=0; i<buflen; i++) {
    printf("%02x ", buf[i]);
    printf(" ");
  }
}

と電話する

hexadumpunformatted(buffer, bytecount);

epatel の優れたスニペット(これは完全にフォーマットされたダンプを提供します) から改作されました。

于 2012-09-07T15:57:00.343 に答える
1

私の提案は、最初にtcpdumpwiresharkなどのスニファーを使用して、ワイヤーで何が起こっているかを確認することです。送信されたバイトがSMPP PDUに準拠していることを確認します。SDLNet_TCP_Recv()問題がなければ、 を使用して読み取ったバッファをダンプし、hexdump(3)一致するかどうかを確認します。

コードに関する注意事項:

  • 初期化された場所はどこにもありませんipが、コードを貼り付けるときにその部分をスキップしただけだと思います。
  • int bufSize = 1024; char message[bufSize];C99でのみ有効です。GCCを想定して、少なくとも-Wall -pedanticすべての警告をキャッチするために常にコンパイルします。
  • バッファーはスタック上にあるため、呼び出しチェーンの上位の関数に渡すと、結果はU ndefined B ehaviorになります。

また、これを単純なバークレーソケットで再現してみます.SDLよりもそれほど難しくはありませんが、はるかに楽しいです:)

于 2010-03-20T00:58:32.647 に答える