戻る
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();