Minggu, Januari 11, 2009

Pemrogramman Socket dengan C/C++ di Windows

Ketika kita menggunakan layanan FTP, IRC dan Web/HTTP socket memegang peranan penting dalam pengambilan dan penyampaian informasi karena dengan socket lah aliran data tersebut di kirimkan baik dari server ke client atau dari client satu ke client yang lain melalui server. Dan menjadi sebuah keharusan bagi seorang programmer untuk mengetahui konsep programming dan cara penggunaan socket apalagi ketika program/aplikasi yang di rancangnya berkaitan erat dengan aplikasi jaringan internet atau TCP-IP.

Di sini akan dijelaskan bagaimana cara membuat socket client-server dengan menggunakan bahasa C/C++ yang berbasis windows.

Mengapa under windows dan bukan under linux/*nix ?

Tentu pilihan ini di tujukan agar kita yang sebagian besar pemakai windows bisa mencoba dan mempraktekan programming socket ini. Selain itu juga untuk memberikan sesuatu yang sedikit berbeda karena contoh yang nanti saya berikan merupakan aplikasi socket yang run under console dan bukan under GUI. Dan yang jelas programming socket di C/C++ jauh lebih stabil dan cepat di bandingkan dengan bahasa pemrograman yang lain.

Metode yang di gunakan saya di sini benar-benar merupakan dasar dari pemrograman socket dan mungkin bagi Anda yang biasa bermain dengan ActiveX Control Socket seperti Winsock.OCX (VB) atau di Delphi seperti PowerSocket, Client Socket, Server Socket dan sebagainya akan melihat perbedaan yang nyata walau pun sebenarnya ActiveX Control tersebut juga di buat dengan metode yang sama. Perbedaannya hanya terletak pada cara penggunaan dan kemudahan yang di tawarkan.

Sebelumnya bagi Anda yang ingin memperdalam fungsi-fungsi yang ada dalam socket programming silahkan baca referensinya di http://www.sockets.com/ . Di sini saya menggunakan Microsoft Visual C++ 6.0 (rekomended) yang memiliki fungsi jauh lebih banyak dan lebih baik di bandingkan Borland C++.

SOCKET.C :

#include

#include

#include

#include

#include

#include

void initsock()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

fprintf(stderr, "Error Couldnt Init Winsock!\n");

return;

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return;

}

}

void killsock()

{

WSACleanup();

}

unsigned long int net_resolve(char *host)

{

long i;

struct hostent *he;

i = inet_addr(host);

if (i == -1) {

he = gethostbyname(host);

if (he == NULL)

return 0;

else

return (*(unsigned long *) he->h_addr);

}

return i;

}

int connect_to(char *server, unsigned short port)

{

struct sockaddr_in addrin;

UINT sock;

sock = socket(AF_INET,SOCK_STREAM,0);

if(sock == INVALID_SOCKET)

{

fprintf(stderr, "Can't make socket ...!\n");

return -1;

}

memset(&addrin,0,sizeof(addrin));

addrin.sin_family = AF_INET;

addrin.sin_port = htons(port);

addrin.sin_addr.s_addr = net_resolve(server);

if(addrin.sin_addr.s_addr == INADDR_NONE)

{

fprintf(stderr, "Address not found !\n");

return -1;

}

if (connect(sock,(struct sockaddr*)&addrin,sizeof(addrin)) == SOCKET_ERROR)

{

fprintf(stderr, "Can't connect to %s \n", server);

closesocket(sock);

return -1;

}

return sock;

}

void shell (int sock)

{

int l;

char buf[512];

char rbuf[8192];

fd_set rfds;

//If not zero it would make error

FD_ZERO (&rfds);

while (1) {

FD_SET (0, &rfds);

FD_SET (sock, &rfds);

select (sock + 1, &rfds, NULL, NULL, NULL);

if (FD_ISSET (0, &rfds)) {

gets(buf);

if (strlen(buf) > 0) {

//this needed if you are use socket in windows

strcat(buf,"\r\n");

send (sock, buf, strlen(buf),0);

}

}

if (FD_ISSET (sock, &rfds)) {

l = recv (sock, rbuf, strlen(rbuf), 0);

if (l == 0) {

printf ("Connection closed by foreign host.\n");

exit (EXIT_FAILURE);

} else if (l == -1) {

perror ("read remote");

exit (EXIT_FAILURE);

}

write(1, rbuf, l);

//make new line

//printf("\n");

}

}

}

int main(int argc, char **argv)

{

char *server;

USHORT port;

UINT sock;

if (argc <>

fprintf(stderr, "Client Socket by Schizoprenic, Xnuxer Research\n"

"\nsocket \n\n");

return -1;

}

initsock();

server = argv[1];

port = atoi(argv[2]);

sock = connect_to(server, port);

if (sock == -1) {

fprintf(stderr, "Failed to connect!\n");

closesocket(sock);

return -1;

} else fprintf(stderr, "Connected!\n");

shell(sock);

killsock();

return(0);

}

Kemudian buat satu project Win32 Console Aplication untuk Server dan tambahkan source di bawah ini ke dalam project Anda.

SERVER.C:

#include

#include

#include

#include

#include

#include

void initsock()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

fprintf(stderr, "Error Couldnt Init Winsock!\n");

return;

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return;

}

}

void killsock()

{

WSACleanup();

}

int listen_port(unsigned short port)

{

UINT sock;

struct sockaddr_in addrin;

sock = socket(AF_INET,SOCK_STREAM,0);

if(sock == INVALID_SOCKET)

{

fprintf(stderr, "Can't make socket ...!\n");

return -1;

}

memset(&addrin,0,sizeof(addrin));

addrin.sin_family = AF_INET;

addrin.sin_port = htons(port);

addrin.sin_addr.s_addr = INADDR_ANY;

if (bind(sock,(struct sockaddr*)&addrin,sizeof(addrin)) != 0)

{

closesocket(sock);

printf("Can't binding on port %d ...!\n", port);

return -1;

}

if (listen(sock,5) != SOCKET_ERROR)

printf("Listen successfull!\n");

return sock;

}

void shell (int servsock)

{

int l, sock;

char buf[512];

char rbuf[8192];

fd_set rfds;

struct sockaddr client;

int len_client;

len_client = sizeof(client);

sprintf(buf, "Enter Data: ");

FD_ZERO (&rfds);

while (1) {

FD_SET (sock, &rfds);

if (sock <= 0) {

sock = accept(servsock,(struct sockaddr *)&client, &len_client);

if (sock > 0)

printf("Accepting Connection!\n");

}

select (sock, &rfds, NULL, NULL, NULL);

if (FD_ISSET (sock, &rfds)) {

l = recv (sock, rbuf, strlen(rbuf), 0);

if (l == 0) {

printf ("Connection closed by foreign host.\n");

exit (EXIT_FAILURE);

} else if (l == -1) {

perror ("read remote");

exit (EXIT_FAILURE);

}

write(1, rbuf, l);

//make new line

printf("\n");

send (sock, buf, strlen(buf), 0);

}

}

}

int main(int argc, char **argv)

{

USHORT port;

UINT sock1;

if (argc == 1) {

fprintf(stderr, "server \n");

return -1;

}

initsock();

port = atoi(argv[1]);

sock1 = listen_port(port);

shell(sock1);

closesocket(sock1);

killsock();

return 0;

}

Compile kedua project tersebut dan jangan lupa untuk menyertakan link wsock32.lib dan kernel32.lib ke project-setting

 

Copyright © 2011 by fey_leo83