C Socket Programming

socket is a protocol independent method of creating a connection between processes. sockets can be either :

  • connection based or connectionless : is a connection established before communication or does each packet describe the destination?
  • packet based or stream based : are there message boundaries or its one stream?
  • reliable or unreliable : can messages be lost, duplicated, reordered or corrupted?

Socket Characteristics :

socket are characterized by their domain, type and transport protocol. common domains are:

  • AF_UNIX: address format is UNIX pathname
  • AF_INET: address format is host and port number

common types are :

  • virtual circuit : received in order transmitted and reliably
  • datagram : arbitary, unreliable.

each sockets type has one or more protocols. example :

  • TCP/IP (virtual circuits)
  • UDP (datagram)

genaral use of sockets :

  • connection based socket communicate client server: the server waits for a connection from the client.
  • connectionless sockets are peer to peer: each process is symetric

sockets API

  • socket: creates a socket of a given domain, type, protocol
  • bind: assign name to the socket
  • listen: specifies the number of pending connections that can be queued for a server socket.
  • accept: server accepts a connection request from a client
  • connect: client request a connection request to a server
  • send, sendto: write to connection.
  • recv, recvfrom: read from connection
  • shutdown: end the call

The Server Code Example :

/* tcpserver.c */
/* tommy agustianto 2010 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main()
{
int sock, connected, bytes_recieved , true = 1;
char send_data [1024] , recv_data[1024];

struct sockaddr_in server_addr,client_addr;
int sin_size;

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror(“Socket”);
exit(1);
}

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) {
perror(“Setsockopt”);
exit(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);

if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))
== -1) {
perror(“Unable to bind”);
exit(1);
}

if (listen(sock, 5) == -1) {
perror(“Listen”);
exit(1);
}

printf(“\nTCPServer Waiting for client on port 5000”);
fflush(stdout);

while(1)
{

sin_size = sizeof(struct sockaddr_in);

connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);

printf(“\n I got a connection from (%s , %d)”,
inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));

while (1)
{
printf(“\n SEND (q or Q to quit) : “);
gets(send_data);

if (strcmp(send_data , “q”) == 0 || strcmp(send_data , “Q”) == 0)
{
send(connected, send_data,strlen(send_data), 0);
close(connected);
break;
}

else
send(connected, send_data,strlen(send_data), 0);

bytes_recieved = recv(connected,recv_data,1024,0);

recv_data[bytes_recieved] = ”;

if (strcmp(recv_data , “q”) == 0 || strcmp(recv_data , “Q”) == 0)
{
close(connected);
break;
}

else
printf(“\n RECIEVED DATA = %s ” , recv_data);
fflush(stdout);
}
}

close(sock);
return 0;
}

——————– client code ———————–

/* tcpclient.c */
/* tommy agustianto 2010 */
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int main()

{

int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr;

host = gethostbyname(“172.18.22.171”);

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror(“Socket”);
exit(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);

if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
perror(“Connect”);
exit(1);
}

while(1)
{

bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = ”;

if (strcmp(recv_data , “q”) == 0 || strcmp(recv_data , “Q”) == 0)
{
close(sock);
break;
}

else
printf(“\nRecieved data = %s ” , recv_data);

printf(“\nSEND (q or Q to quit) : “);
gets(send_data);

if (strcmp(send_data , “q”) != 0 && strcmp(send_data , “Q”) != 0)
send(sock,send_data,strlen(send_data), 0);

else
{
send(sock,send_data,strlen(send_data), 0);
close(sock);
break;
}

}
return 0;
}

running test :

I use two computer to communicate each other…

put the client program to the remote computer and the server program in your pc.

assume that my PC is 172.18.22.171 and the remote computer (client) is 172.18.22.110

don’t go anywhere, just sit down and do it from ur desk. ssh the remote computer by typing :

ssh username@ipremotecomputer..

and run the client program.

best regards

Tommy Agustianto 2010

Advertisements
C Socket Programming

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s