戻る

WINSOCKプログラム(クライアント側)

winsockを初期化する。
ソケットを生成して、接続要求を行う。
接続したら受信、切断イベントを待つ。
接続中は随時送信を行える。

サンプルコード

メンバ変数、文字定数
#define WM_WINSOCK	WM_APP + 0	// イベント発生時に受け取るメッセージ

	SOCKET m_Sock = INVALID_SOCKET;		// 接続用ソケット
初期化から接続まで
	SOCKADDR_IN addrServer;

	// ソケットを生成する。
	m_Sock = socket(AF_INET, SOCK_STREAM, 0);
	if (m_Sock == INVALID_SOCKET)
	{
		return;
	}

	// コネクトイベントを待つ。
	if (WSAAsyncSelect(m_Sock, this->m_hWnd, WM_WINSOCK, FD_CONNECT) == SOCKET_ERROR)
	{
		return;
	}

	// 接続する。
	memset(&addrServer, 0, sizeof(addrServer));
	addrServer.sin_family = AF_INET;
	addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");	// サーバーIPアドレスを設定する
	addrServer.sin_port = htons(10000);	// ポート番号を設定する。

	// 接続する。
	if (connect(m_Sock, (const sockaddr*)&addrServer, sizeof(addrServer)) == SOCKET_ERROR)
	{
		return;
	}

	// 接続タイムアウトのタイマーをセットする。
	SetTimer(1, 5000);
イベント発生時の処理
LRESULT CSampleServerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	WORD selectErr;		// selectイベントのエラーコード
	char cBuff[1024];	// 受信バッファ

	switch (message)
	{
	case WM_WINSOCK:
		// selectイベントのエラーコードを取得する。
		selectErr = WSAGETSELECTERROR(lParam);

		switch (WSAGETSELECTEVENT(lParam))
		{
		case FD_CONNECT:
			// 接続タイムアウトのタイマーを破棄する。
			KillTimer(1);

			if (selectErr != 0)
			{
				// エラー処理を行う。

				break;
			}

			// 受信/クローズイベントを待つ。
			if (WSAAsyncSelect(m_Sock, this->m_hWnd, WM_WINSOCK, FD_READ | FD_CLOSE) == SOCKET_ERROR)
			{
				// エラー処理を行う。

				break;
			}

			break;

		case FD_READ:
			if (selectErr != 0)
			{
				// エラー処理を行う。

				break;
			}

			// 受信する。
			if (recv(m_Sock, cBuff, sizeof(cBuff), 0) == SOCKET_ERROR)
			{
				// エラー処理を行う。

				break;
			}

			break;

		case FD_CLOSE:
			// タイマーを破棄する。
			KillTimer(1);

			// ソケットを閉じる。
			if (m_Sock != INVALID_SOCKET)
			{
				shutdown(m_Sock, SD_BOTH);
				closesocket(m_Sock);
				m_Sock = INVALID_SOCKET;
			}

			break;
		}

		break;

	case WM_TIMER:
		// タイムアウト時の処理を行う。

		break;
	}

	return CDialog::DefWindowProc(message, wParam, lParam);
}
送信処理
	char cBuff[256];

	if (send(m_Sock, cBuff, sizeof(cBuff), 0) == SOCKET_ERROR)
	{
		return;
	}
終了処理
	// socketをクローズする。
	if (m_Sock != INVALID_SOCKET)
	{
		shutdown(m_Sock, SD_BOTH);
		closesocket(m_Sock);
		m_Sock = INVALID_SOCKET;
	}

	// winsockを終了する。
	WSACleanup();
inserted by FC2 system