Web/DB プログラミング徹底解説

ホーム > Windows の神髄 > WinSock 用ヘルパー関数

WinSock 用ヘルパー関数

スポンサーリンク

ネットワークプログラミングを行うにあたり、データ読み出し用及びデータダンプ用のファンクションを書きました。 非常に単純な仕組みですからあまり説明は要らないかもしれませんが、一応次のようなものです。

ヘッダファイルはこちらの sockhelper.h です。

#pragma once

#include <winsock2.h>

void PrintHexDump(DWORD length, PBYTE buffer);
BOOL ReceiveData( SOCKET hSocket, PBYTE pbBuff, ULONG ulSize );
BOOL SendData(SOCKET hSocket, PBYTE pbBuff, ULONG ulSize);

それぞれの関数は以下のようなものです。

ReceiveData hSocket で示すソケットハンドルから、ulSize バイト分のデータを pbBuff に読み込みます。
SendData pbBuff にあるデータ ulSize バイト分を、ソケットハンドル hSocket に書き出します。
PrintHexDumpbuffer で示したアドレスから length (バイト)長のデータを 16 進数表記で出力します。 ちなみに、これはソケットに限らずいつでも使えます。

実装ファイルは sockhelper.cpp です。適当に直して使ってください。

#include "sockhelper.h"
#include <stdio.h>


///////////////////////////////////////////////////////////////////////////////


void PrintHexDump(DWORD length, PBYTE buffer) {
     
     DWORD i,count,index;
     CHAR rgbDigits[]="0123456789abcdef";
     CHAR rgbLine[100];
     char cbLine;

     for(index = 0; length; length -= count, buffer += count, index += count) {
          count = (length > 16) ? 16:length;

          sprintf(rgbLine, "%4.4x  ",index);
          cbLine = 6;

          for(i=0;i<count;i++) {
               rgbLine[cbLine++] = rgbDigits[buffer[i] >> 4];
               rgbLine[cbLine++] = rgbDigits[buffer[i] & 0x0f];
               if(i == 7) {
                    rgbLine[cbLine++] = ':';
               } 
               else {
                    rgbLine[cbLine++] = ' ';
               }
          }
          for(; i < 16; i++) {
               rgbLine[cbLine++] = ' ';
               rgbLine[cbLine++] = ' ';
               rgbLine[cbLine++] = ' ';
          }

          rgbLine[cbLine++] = ' ';

          for(i = 0; i < count; i++) {
               if(buffer[i] < 32 || buffer[i] > 126) 
               {
                    rgbLine[cbLine++] = '.';
               } 
               else {
                    rgbLine[cbLine++] = buffer[i];
               }
          }
          
          rgbLine[cbLine++] = 0;
          printf("%s\n", rgbLine);
     }
     

} // end PrintHexDump


///////////////////////////////////////////////////////////////////////////////


BOOL ReceiveData( SOCKET hSocket, PBYTE pbBuff, ULONG ulSize ) {

     BYTE bTemp[1024];
     PBYTE pBuffPointer = pbBuff;
     ULONG ByteRead = 0;
     ULONG ulTotalSize = ulSize;

     // パラメータチェック
     if(pbBuff == NULL || ulSize < 1) {
          printf("Error: ReceiveData - パラメータが不正です.\n");
          return FALSE;
     }

     // データの受け取り
     do {
          ::ZeroMemory(bTemp, 1024);

          ByteRead = recv(hSocket, (char*)bTemp, 
               ulTotalSize > 1024 ? 1024 : ulTotalSize, 0);

          if(SOCKET_ERROR == ByteRead) {
               printf(
                    "Error In Receiving Data. "
                    "WSAGetLastError = 0x%08x\n",
                    WSAGetLastError());
               return FALSE;
          }

          memcpy(pBuffPointer, bTemp, ByteRead);

          pBuffPointer += ByteRead;
          ulTotalSize -= ByteRead;
     
     } while(ulTotalSize > 0);

     return TRUE;
}


///////////////////////////////////////////////////////////////////////////////


BOOL SendData(SOCKET hSocket, PBYTE pbBuff, ULONG ulSize) {

     PBYTE pBuffPointer = pbBuff;
     ULONG ByteSent = 0;
     ULONG ulTotalSize = ulSize;

     // パラメータチェック
     if(NULL == pbBuff || ulSize < 1) {
          printf("Error: SendData - パラメータが不正です.\n");
          return FALSE;
     }

     // データの送信
     do {
          ByteSent = send(hSocket, (char*)pBuffPointer, ulTotalSize, 0);

          if(SOCKET_ERROR == ByteSent) {
               printf(
                    "Error In Sending Data. "
                    "WSAGetLastError = 0x%08x\n",
                    WSAGetLastError());
               return FALSE;
          }

          pBuffPointer += ByteSent;
          ulTotalSize -= ByteSent;
     
     } while(ulTotalSize > 0);

     return TRUE;
}

ダウンロード (sockhelper.zip)

スポンサーリンク