[kaze's test] プログラミングメモ →目次


TCPソケット送受信(VC++)

Windows Sockets APIを使用するTCPソケット送受信のメモです。
メモとして、下記の2関数を作りました。テスト時に、別々の実行ファイルを作ります。

tcp_server()は、サーバー側のプログラムです。listen用のソケットを作成して、listenをする、クライアントからの接続要求を受けたら、Acceptで通信用のソケットを作成する。クライアントから受信を受けたら、返信をするような処理です。
tcp_client()は、サーバーに接続要求をして、送信して、受信を待つような処理です。


#include "stdafx.h"
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")

void tcp_server()
{
    unsigned short port = 10000;
    SOCKET sockListen;
    SOCKET sockWork;
    struct sockaddr_in sockAddrInListen;
    struct sockaddr_in sockAddrInWork;

    memset(&sockAddrInListen, 0, sizeof(sockAddrInListen));
    sockAddrInListen.sin_port = htons(port);
    sockAddrInListen.sin_family = AF_INET;
    sockAddrInListen.sin_addr.s_addr = htonl(INADDR_ANY);

    sockListen = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == sockListen)
        return;

    if (SOCKET_ERROR == bind(sockListen, 
                             (struct sockaddr *) &sockAddrInListen, 
                             sizeof(sockAddrInListen)))
    {
        closesocket(sockListen);
        return;
    }

    if (SOCKET_ERROR == listen(sockListen, 1))
    {
        closesocket(sockListen);
        return;
    }

    int iSizeofSockAddrInWork = sizeof(sockAddrInWork);
    sockWork = accept(sockListen, 
                      (struct sockaddr *)&sockAddrInWork, 
                      &iSizeofSockAddrInWork);
    if (INVALID_SOCKET == sockWork)
    {
        closesocket(sockListen);
        return;
    }

    while(1) 
    {
        char buff[256];
        memset(buff, 0, sizeof(buff));
        int len = recv(sockWork, buff, 256, 0); 
        if(len <= 0) 
            break;
        printf("Data Received = %s\n", buff);

        strcat(buff, "3.");
        send(sockWork, buff, strlen(buff)+1, 0);

    }
    closesocket(sockWork);
    closesocket(sockListen);
}

void tcp_client()
{
    unsigned short port = 10000;
    SOCKET sockClient;
    struct sockaddr_in sockAddrInServer;

    memset(&sockAddrInServer, 0, sizeof(sockAddrInServer));
    sockAddrInServer.sin_port = htons(port);
    sockAddrInServer.sin_family = AF_INET;
    sockAddrInServer.sin_addr.s_addr = inet_addr("192.168.0.5");

    sockClient = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == sockClient)
        return;

    if (SOCKET_ERROR == connect(sockClient, 
                                (struct sockaddr *) 
                                &sockAddrInServer, 
                                sizeof(sockAddrInServer)))
        return;


    for(int i = 0; i < 5; i++) 
    {
        char sendbuff[] = "hello, 1+2=";
        send(sockClient, sendbuff, strlen(sendbuff)+1, 0);
        
        Sleep(1000);

        char recvbuff[256];
        memset(recvbuff, 0, sizeof(recvbuff));
        int len = recv(sockClient, recvbuff, 256, 0); 
        if(len <= 0) 
        {
            break;
        }
        printf("Data Received = %s\n", recvbuff);
    }

    closesocket(sockClient);
}

int main(int argc, char* argv[])
{
    WSADATA wsadata;
    if (0 != WSAStartup(MAKEWORD(2,0), &wsadata))
    {
        printf("WSAStartup Faild.\n");
        return -1;
    }

    //tcp_server();
    tcp_client();

    WSACleanup();
    return 0;
}