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.
- Buat aplikasi console Win32 Application
- 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 )
- Lakukan konfigurasi Windows Socket library seperti pada gambar dibawah ini
- Kalau sudah melakukan konfigurasi baik untuk server maupun client maka selanjutnya kita baru coding

- Dibagian file header stdafx.h tambahkan code disini atau langsung ke CPP nya kalau memang tidak memakai stdafx.h : #include <winsock2.h>
- 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