Getting Started to build Socket Client-Server using C++

Paper ini sekedar getting started untuk memulai coding socket dengan C++. Persiapan yang harus dilakukan sebelum coding:

  • Compiler C++. Disini pakai VC++ 8.0
  • IDE VC++. Saya memakai Visual C++ 8.0 (Satu shipping dengan Visual Studio 2005)
  • Platform SDK. Kalau install VC++ 8.0 biasanya include didalamnya ada platform SDK

Windows Socket 2 Architecture
Secara general, Windows Socket 2 Architecture dapat dilihat pada gambar dibawah ini



Kalau dilihat gambar diatas, untuk dapat coding Windows Socket 2, kita memerlukan library WS2_32.dll

Start Coding Socket dengan Visual C++

Pada session kali ini, kita akan membuat aplikasi console. Untuk dapat coding Windows Socket 2 maka kita harus memasang directory dari Platform SDK VC++ karena library (*.lib) dan header file nya ada disana.

  1. Buat aplikasi console Win32 Application
  2. Lakukan konfigurasi Platform SDK dibagian propertie project dapat dilihat pada gambar dibawah ini (misalkan VS 2005 di instal di directory D maka dimasukkan path platform SDK yaitu D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include )
  3. Lakukan konfigurasi Windows Socket library seperti pada gambar dibawah ini
  4. Kalau sudah melakukan konfigurasi baik untuk server maupun client maka selanjutnya kita baru coding Party!!!
  5. Dibagian file header stdafx.h tambahkan code disini atau langsung ke CPP nya kalau memang tidak memakai stdafx.h : #include <winsock2.h>
  6. Untuk bagian server

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{

    // Initialize Winsock.
    WSADATA wsaData;   
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");



    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET )
    {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Bind the socket.
    sockaddr_in service;

    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    service.sin_port = htons( 27015 );

    if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR )
    {
        printf( "bind() failed.\n" );
        closesocket(m_socket);
        return 0;
    }
   
    // Listen on the socket.
    if ( listen( m_socket, 1 ) == SOCKET_ERROR )
        printf( "Error listening on socket.\n");

    // Accept connections.
    SOCKET AcceptSocket;

    printf( "Waiting for a client to connect...\n" );
    while (1)
    {
        AcceptSocket = SOCKET_ERROR;
        while ( AcceptSocket == SOCKET_ERROR )
        {
            AcceptSocket = accept( m_socket, NULL, NULL );
        }
        printf( "Client Connected.\n");
        m_socket = AcceptSocket;
        break;
    }
   
    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Server: Sending Data.";
    char recvbuf[32] = "";
   
    bytesRecv = recv( m_socket, recvbuf, 32, 0 );
    printf( "Data Recv: %s\n", recvbuf );
    printf( "Bytes Recv: %ld\n", bytesRecv );
   
    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    int c = getchar();

    return 0;
}

Untuk bagian client

 #include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET )
    {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return 0;
    }

    // Connect to a server.
    sockaddr_in clientService;

    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    clientService.sin_port = htons( 27015 );

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR)
    {
        printf( "Failed to connect.\n" );
        WSACleanup();
        return 0;
    }

    // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "This is my socket.";
    char recvbuf[32] = "";

    bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
    printf( "Bytes Sent: %ld\n", bytesSent );

    while( bytesRecv == SOCKET_ERROR )
    {
        bytesRecv = recv( m_socket, recvbuf, 32, 0 );
        if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET )
        {
            printf( "Connection Closed.\n");
            break;
        }
        if (bytesRecv < 0)
            return 0;
        printf( "Bytes Recv: %ld\n", bytesRecv );
    }

    int c = getchar();

    return 0;
}

Secara run all application


source code lengkapnya dapat didownload disini
http://www.peopleenterprise.com/files/9/c_language/default.aspx

Share this post: | | | |
Published Thursday, September 28, 2006 3:19 PM by Agus Kurniawan
Filed under: ,

Comments

No Comments

Leave a Comment

(required) 
(required) 
(optional)
(required) 

Enter the numbers above:
Powered by Community Server (Commercial Edition), by Telligent Systems