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