WinSock2を使用したTCP接続



WinSock2を使用したTCP接続による、データ受け渡しの例を紹介します。


------------- クライアント側のコード ----------------


// TCP接続を確率する
int CTcpClientSock::tcp_connect(char* IP_Address)
{
    WSADATA wsaData;
    struct sockaddr_in server;

    // winsock2の初期化
    WSAStartup(MAKEWORD(2,0), &wsaData);

    // ソケットの作成
    sock = socket(AF_INET, SOCK_STREAM, 0);

    // 接続先指定用構造体の準備
    server.sin_family = AF_INET;
    server.sin_port = htons(56789);
    server.sin_addr.S_un.S_addr = inet_addr(IP_Address);

    // サーバに接続
    connect(sock, (struct sockaddr *)&server, sizeof(server));

    return 0;
}

// サーバからデータを受信
int CTcpClientSock::recive()
{
    memset(RevData, 0, sizeof(RevData));
    int n = recv(sock, RevData, sizeof(RevData), 0);

    return n;
}

// TCP接続を切断する
int CTcpClientSock::tcp_disconnect(void)
{
    
    WSACleanup();

    return 0;
}


------------- サーバ側のコード ----------------

#include "Windows.h"
#include 

CRITICAL_SECTION g_critical_section;
SOCKET sock0;
SOCKET sock;


// WinSockをTCPで起動する
//[戻り値]正常 = 1、失敗 = -1
int CTcpSvSock::StartSvSock(void)
{
    WSADATA wsaData;
    struct sockaddr_in addr;
    
    if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
        return -1;
    }

    sock0 = socket(AF_INET, SOCK_STREAM, 0);
    if (sock0 == INVALID_SOCKET) {
        return -1;
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons(56789);
    addr.sin_addr.S_un.S_addr = INADDR_ANY;

    if (bind(sock0, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
        return -1;
    }

    if (listen(sock0, 5) != 0) {
        return -1;
    }

    return 1;
}

// Clientへデータを送信する
void SendToClient(char* SendData)
{
    struct sockaddr_in client;
    int SendDataLen, len, n;

    SendDataLen = strlen(SendData);

    //Clientが切断するまで、データを送る
    while(1){

        //クリティカルセクションに入る
        EnterCriticalSection(&g_critical_section);

        //クライアントからの接続を待つ
        len = sizeof(client);
        sock = accept(sock0, (struct sockaddr *)&client, &len);
        if (sock == INVALID_SOCKET) {
            AfxMessageBox("クライアントとの接続に失敗しました");
            break;
        }
        
        //クライアントへデータを送る
        n = send(sock, SendData, SendDataLen, 0);
        if (n < 1) {
            AfxMessageBox("クライアントへのデータ送信に失敗しました");
            break;
        }

        closesocket(sock);

        //クリティカルセクション
        LeaveCriticalSection(&g_critical_section);
    }

    //Threadを終了
    ExitThread(0);

}

// WinSockを終了する
void CTcpSvSock::EndSvSock(void)
{

    //クリティカルセクションを終了
    DeleteCriticalSection(&g_critical_section);
    WSACleanup();
}

//クライアントからの接続受けのスレッド開始
void CTcpSvSock::SvStartThread(void)
{
    HANDLE hThread;
    DWORD threadID;

    
    char *SendData = new char[m_SendStrSv2Cl.GetLength()];
    strcpy(SendData, m_SendStrSv2Cl);

    //クリティカルセクションを初期化する
    InitializeCriticalSection(&g_critical_section);

    //スレッドの開始
    hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)SendToClient,
                (void*)SendData, 0, &threadID);

}



[サンプル・ソース(クライアント側)]

[サンプル・ソース(サーバー側)]


(注意)このサンプルは、Visual C++ 2003.Net で作成されています。