データを送受信
更新日2006年10月03日
参照 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/sending_and_receiving_data.asp

以下のコードは、sendrecv関数を示します。

サーバ


#define DEFAULT_BUFLEN 512

    char recvbuf[DEFAULT_BUFLEN];
    char sendbuf[DEFAULT_BUFLEN];
    int iResult,
        recvbuflen = DEFAULT_BUFLEN,
        sendbuflen = DEFAULT_BUFLEN;

    /*
     * 接続元が接続をシャットダウンするまで繰り返し受信を続ける
     */
    do
    {
        ZeroMemory(recvbuf, recvbuflen);
        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (0 < iResult)
        {
            printf("Bytes received: %d\n", iResult);
            printf("received data: [%s]\n", recvbuf);
            ZeroMemory(sendbuf, sendbuflen);
            memcpy(sendbuf, recvbuf, iResult);
        }
        else if (iResult == 0)
        {
            printf("Connection closing...\n");
        }
        else
        {
            printf("recv failed: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }
    } while (0 < iResult);

    /*
     * 送信元にバッファと同じ内容をエコーする
     */
    printf("send data: [%s]\n", sendbuf);
    iResult = send(ClientSocket, sendbuf, (int)strlen(sendbuf), 0);
    if (iResult == SOCKET_ERROR)
    {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %ld\n", iResult);

クライアント


#define DEFAULT_BUFLEN 512

    char *sendbuf = "this is a test";
    char recvbuf[DEFAULT_BUFLEN];
    int iResult;

    /*
     * 最初のバッファを送信
     */
    iResult = send(ConnectSocket, sendbuf, (int)strlen(sendbuf), 0);
    if (iResult == SOCKET_ERROR)
    {
        printf("send failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    printf("Bytes Sent: %ld\n", iResult);

    /*
     * 送信データがそれ以上ないなら、接続をシャットダウン
     */
    iResult = shutdown(ConnectSocket, SD_SEND);
    if (iResult == SOCKET_ERROR)
    {
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ConnectSocket);
        WSACleanup();
        return 1;
    }

    /*
     * 接続先が接続を閉じるまで、繰り返し受信する
     */
    do
    {
        ZeroMemory(recvbuf, recvbuflen);
        iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
        if (0 < iResult)
        {
            printf("Bytes received: %d\n", iResult);
            printf("recieved data: [%s]\n", recvbuf);
        }
        else if (iResult == 0)
        {
            printf("Connection closed\n");
        }
        else
        {
            printf("recv failed: %d\n", WSAGetLastError());
        }
    } while (0 < iResult);

そのsendrecvの両関数は送信または受信バイト数を整数値として戻します、またはエラー値を戻します。 各々の関数も、同様のパラメータを取ります: そのアクティブソケット、charバッファ、送受信バイト数、そして、使われるいくつかのフラグでも。

完全なるソースコード