戻る

WINSOCKプログラム(サーバー側)

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

サンプルコード

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

	SOCKET m_Sock = INVALID_SOCKET;		// サーバ側ソケット
	SOCKET m_SockCon = INVALID_SOCKET;	// 接続用ソケット
初期化から接続要求待ちまで
	// winsockを初期化する。
	WSADATA wsaData;
	if (WSAStartup(2, &wsaData) != 0)
	{
		return FALSE;
	}

	// SOCKETを生成する。
	m_Sock = socket(AF_INET, SOCK_STREAM, 0);
	if (m_Sock == INVALID_SOCKET)
	{
		return FALSE;
	}

	// socketの設定を行う。
	SOCKET_IN SockAddr_In;
	memset(&SockAddr_In, 0x00, sizeof(SockAddr_In));
	SockAddr_In.sin_family = AF_INET;
	SockAddr_In.sin_addr.S_un.S_addr = INADDR_ANY;
	SockAddr_In.sin_port = htons(10000);			// ポート番号を設定する。
	bind(m_Sock, (LPSOCKADDR)&SockAddr_In, sizeof(SockAddr_In));

	// クライアントからの接続要求を待てる状態にする。
	if (listen(m_Sock, 5) != 0)
	{
		return FALSE;
	}

	// ソケットイベント(接続要求)を待つ。
	if (WSAAsyncSelect(m_Sock, this->m_hWnd, WM_WINSOCK, FD_ACCEPT) != 0)
	{
		return FALSE;
	}
イベント発生時の処理
LRESULT CSampleServerDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	sockaddr SockAddr;
	int nAddrLen;
	char cBuff[256];

	switch (message)
	{
	case WM_WINSOCK:
		switch (WSAGETSELECTEVENT(lParam))
		{
		case FD_ACCEPT:
			// 接続を受け入れる。
			nAddrLen = sizeof(SockAddr);
			m_SockCon = accept(m_Sock, &SockAddr, &nAddrLen);

			// ソケットイベント(リード,クローズ)を待つ。
			WSAAsyncSelect(m_SockCon, this->m_hWnd, WM_WINSOCK, FD_READ|FD_CLOSE);
			break;

		case FD_READ:
			// バッファに受信データを格納する。
			memset(cBuff, 0, sizeof(cBuff));
			recv(m_SockCon, cBuff, sizeof(cBuff), 0);
			break;

		case FD_CLOSE:
			// socketをクローズする。
			if (m_SockCon != INVALID_SOCKET)
			{
				shutdown(m_SockCon, SD_BOTH);
				closesocket(m_SockCon);
				m_SockCon = INVALID_SOCKET;
			}
			break;
		}
		break;
	}

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

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

	if (m_Sock != INVALID_SOCKET)
	{
		closesocket(m_Sock);
		m_Sock = INVALID_SOCKET;
	}

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