いろんなものはつながっている

ネットワークプログラミング基礎 Socketプログラミング

Socketは例えを使っていろいろなところで説明されている。ホテルの部屋のようなものといったり、郵便ポストのようなものといったり。わたしはここの説明がわかりやすかった。

WinInetではなく、Winsockを用いてwebサイトのソースを取得してみる。
まずWinsockを初期化し、接続先のIP、ポート番号を構造体にセットする。そして、ソケットを作成し、そのソケットで接続先へコネクトする。コネクトできたら、GETリクエストを送り、接続先からのレスポンスをうけとる。

// Socketプログラミング
//
#include "stdafx.h"

#pragma comment(lib, "ws2_32.lib")
#include "winsock2.h"

int ConvertWidetoMultiByte(TCHAR* szBuf);

#define PORT 80
#define BUFFER_SIZE 1024

int _tmain(int argc, _TCHAR* argv[])
{
	// IP アドレス,ポート番号,ソケット,sockaddr_in 構造体
	TCHAR szDestination[]=_T("203.216.251.233");
	int nDestSocket;
	struct sockaddr_in dstAddr;

	// WinSockの初期化
	WSADATA data;
	WSAStartup(MAKEWORD(2,0), &data);

	// 接続先の情報をsockaddr_in 構造体にセット
	memset(&dstAddr, 0, sizeof(dstAddr));
	dstAddr.sin_port = htons(PORT);
	dstAddr.sin_family = AF_INET;
	dstAddr.sin_addr.s_addr = inet_addr(szDestination);

	// ソケットの生成(TCP用)
	nDestSocket = socket(AF_INET, SOCK_STREAM, 0);	

	// 接続
	if(connect(nDestSocket, (struct sockaddr*)&dstAddr, sizeof(dstAddr))){
		printf("%s に接続できませんでした\n", szDestination);
		return(-1);
	}

	// GETリクエストの送信
	TCHAR szUrl[] = _T("http://www.yahoo.co.jp/");
	TCHAR szGetRequest[BUFFER_SIZE];
	_stprintf(szGetRequest, _T("GET %s\n"), szUrl);
	send(nDestSocket, szGetRequest, BUFFER_SIZE, 0);

	// データの受信
	TCHAR szBuffer[BUFFER_SIZE];
	memset(szBuffer, '\0', BUFFER_SIZE);
	while (1){
		// GETリクエストの送信
		int nRet = recv(nDestSocket, szBuffer, BUFFER_SIZE - 1, 0);
		if(nRet == 0) break;
		ConvertWidetoMultiByte(szBuffer);
	}

	// Windows でのソケットの終了
	closesocket(nDestSocket);
	WSACleanup();

	return 0;
}


int ConvertWidetoMultiByte(TCHAR* szBuf)
{
  // 変換
    char szMultiBuf[BUFFER_SIZE];
	memset(szMultiBuf, '\0', BUFFER_SIZE);

    const int nWideByte = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szBuf, -1, NULL, NULL);
    LPWSTR lpw = new WCHAR[nWideByte];
    MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)szBuf, -1, lpw, nWideByte);

    const int nMultiByte = WideCharToMultiByte( CP_ACP, 0, lpw, -1, NULL, 0, NULL, NULL);
    LPSTR lpa = new char[nMultiByte];

    const int nMultiCount = ::WideCharToMultiByte( CP_ACP, 0, lpw, -1, lpa, nMultiByte, NULL, NULL );

    strcpy_s(szMultiBuf, nMultiCount, lpa);
	szMultiBuf[nMultiCount] = _T('\0');

    delete[] lpa;
    delete[] lpw;

	printf("%s", szMultiBuf);

	return 0;

}

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク