Fundamentals of Socket Programming
Fundamentals of Socket Programming
Chapter 6
Fundamentals of Socket Programming
(Recommended reading: Comer, Vol , Chapter !"
Re#ie$ of C Programming
% Some &ata '(pes
'he follo$ing data t(pes are often used in socket
programming:
u_char
u_short
u_long
unsigned )*+it character
unsigned 16*+it integer
unsigned ,*+it integer
- structure is a group of different t(pes of data.
/0ample:
struct info {
char name[20] ;
};
int ID ;
struct info student[60] ;
student[0].name = "chan" ;11
student[0].ID = 1234 ;
student[1].name = "cheung" ;
student[1].ID = 5678 ;
&r. 1.2. 3eung
,
% Casting of &ata '(pes
Casting is to change the data t(pe of a
#aria+le or e0pression to the designated one.
/0ample:
% 4f i is an int, then the data t(pe of the
follo$ing e0pression is dou+le:
(double) (i+1)
% Pointers
/#er( memor( location has an address
% 2e can use this address to access the
content in this memor( location.
- pointer is a #aria+le that stores the
memory address (not the #alue" of a data
item.
&eclaration of pointer #aria+le:
data-type *pointer-variable;
&ereference operator 5:
% *pv gi#es the content stored in the
memor( location $ith address pv.
-ddress operator 6:
% 'he address storing the first memor(
+(te of the #aria+le v is &v.
&r. 1.2. 3eung
%
%
/0ample
% 0 and ( are declared to +e of t(pe
7float7, and p is declared to +e of t(pe
7pointer to float7:
float x, y, *p;
'he follo$ing statements
p = &x ;
y = *p ;
are e8ui#alent to
y = x ;
Pointer and -rra(
'he name of an arra( is actuall( a pointer
to the first element in the arra(.
4f x is a one*dimensional arra(,
% the address of the 1st arra( element is
&x[0] or x;
% the address of the ,nd arra( element is
&x[1] or (x+1);
Pointer '(pes
'he )90)6 memor( s(stem is di#ided into
segments, and each segment has 6: ;.
-n address consists of t$o parts: segment
and offset.
&r. 1.2. 3eung
:
Pointer t(pes:
% - near pointer onl( stores the offset $hich is
relati#e to the data segment.
% - far pointer stores +oth the segment and offset.
<(te =rder
% &ifferent computers ma( ha#e different internal
representation of 16 > ,*+it integer (called host byte
order).
% /0amples
<ig*/ndian +(te order (e.g., used +( ?otorola
6)999":
3ittle*/ndian +(te order (e.g., used +( 4ntel
)90)6":
&r. 1.2. 3eung
!
% 'CP>4P specifies a network byte order $hich
is the big-endian +(te order.
% For some 2inSock functions, their arguments
(i.e., the parameters to +e passed to these
functions" must +e stored in net$ork +(te order.
% 2inSock pro#ides functions to con#ert +et$een
host +(te order and net$ork +(te order:
% Protot(pes for these con#ersion functions:
&r. 1.2. 3eung
6
/ndpoint -ddress
% @eneric /ndpoint -ddress
'he socket a+straction accommodates man(
protocol families.
% 4t supports man( address families.
% 4t defines the follo$ing generic
endpoint address:
% ( address family, endpoint address in
that family )
&ata t(pe for generic endpoint address:
% 'CP>4P /ndpoint -ddress
For 'CP>4P, an endpoint address is
composed of the follo$ing items:
% -ddress famil( is AF_INET (-ddress
Family for InterNET).
% /ndpoint address in that famil( is
composed of an IP address and a port
nmber.
&r. 1.2. 3eung
A
'he 4P address identifies a particular
computer, $hile the port num+er identifies a
particular application running on that
computer.
'he 'CP>4P endpoint address is a special
instance of the generic one:
Port Bum+er
% - port num+er identifies an application
running on a computer.
% 2hen a client program is e0ecuted,
2inSock randoml( chooses an unused
port num+er for it.
% /ach ser#er program must ha#e a pre*
specified port num+er, so that the client
can contact the ser#er.
&r. 1.2. 3eung
)
% 'he port num+er is composed of 16 +its,
and its possi+le #alues are used in the
follo$ing manner:
C 9 * 19,: For $ell*kno$n ser#er
applications.
C 19,: * :D1!1: For user*defined
ser#er applications (t(pical range to
+e used is 19,: * !999".
C :D1!, * 6!!!: For client programs.
% Port num+ers for some $ell*kno$n ser#er
applications:
C 222 ser#er using 'CP: )9
C 'elnet ser#er using 'CP: ,
C S?'P (email" ser#er using 'CP: ,!
C SB?P ser#er using E&P: 161.
&r. 1.2. 3eung
D
% &ata t(pes for 'CP>4P endpoint address:
struct in_addr {
u_long
address */
s_addr ; /* IP
};
C 'he 4P address is stored in a structure
instead of an unsigned long ($ith ,
+its" +ecause of a historical reason.
% so!addr and so!addr"in are compati+le:
% 4f (ou onl( use 'CP>4P, (ou can use
so!addr"in $ithout using so!addr.
&r. 1.2. 3eung
% /0ample 1
C 'he 4P address of a ser#er is
1!).1),.A.6. 4ts decimal #alue is
,66,A,D!!. 2e can specif( the
endpoint address for this ser#er as
follo$s:
struct sockaddr_in ServerAddr;
ServerAddr.sin_family =
AF_INET;
ServerAddr.sin_port = 2000;
ServerAddr.sin_addr.s_addr =
htonl (2662729535);
% /0ample ,
C 2e specif( the endpoint address for a
ser#er as follo$s:
struct sockaddr_in ServerAddr;
ServerAddr.sin_family =
AF_INET;
ServerAddr.sin_port = 2000;
ServerAddr.sin_addr.s_addr =
htonl(INADDR_ANY);
$here the s(m+olic constant
INA!!"_AN# represents a
$ildcard address that matches an( of
the computerFs 4P address(es".
&r. 1.2. 3eung 19
Sketch of a 'CP Client and a 'CP Ser#er
% Esing 'CP, +oth the client and the ser#er use
three maGor steps for communication:
4nitialiHe sockets.
Communicate +et$een sockets.
Close the sockets.
% 4n this section, $e stud( the a+o#e three steps in
detail.
% Remark
Bet$ork communication ma( +e considered
as net$ork 4>=. 'he a+o#e steps are similar
to that for file 4>=:
% =pen a file.
% Read and $rite data.
% Close the file.
% 4nitialiHe Sockets
'here are three initialiHation steps:
% 4nitialiHe 2inSock &33.
% Create a socket.
% -ssign an endpoint address to a socket.
&r. 1.2. 3eung 11
4nitialiHe 2inSock &33
% <efore using 2inSock, an application calls
#$%$tart&p().
C 'hen 2indo$s +inds to the
2inSock &33 and allocates the
necessar( resources to this
application.
% #$%$tart&p() re8uires t$o arguments:
C 'he 1st argument specifies the
#ersion of the re8uested 2inSock.
C 'he ,nd argument returns
information a+out the #ersion of
the 2inSock that is actuall( used.
&r. 1.2. 3eung 1,
% /0ample
#define WSVERS MAKEWORD(2, 0)
WSADATA wsadata ;
bptr = buf;
buflen = 5;
recv(s, bptr, buflen, 0);
&r. 1.2. 3eung ,A
,)
% Close the Sockets
Close a Socket
% =nce a client or ser#er finishes using a
socket, it calls loseso!et() to
C terminate the 'CP connection
associated $ith this socket, and
C deallocate this socket.
% /0ample
closesocket(s);
&r. 1.2. 3eung
Clean Ep
% 2hen an application finishes using
sockets, it must call #$%(lean&p() to
deallocate all data structures and socket
+indings.
% /0ample
WSACleanup();
&r. 1.2. 3eung ,D
% Se8uence of /0ecution of 2inSock Functions
2e assume that 'CP is used and the ser#er
ser#es the clientsK re8uests one after the
other.
Se8uence of e0ecution of 2inSock
functions:
&r. 1.2. 3eung 9
% Remarks on 2inSock Functions
2inSock has defined some data structures
that can +e used in 2inSock programs.
% /0amples
C so!addr
C so!addr"in
2inSock has defined some s(m+olic
constants that can +e used as arguments to
2inSock functions.
% /0amples
C %)"*+,-
C .)"*+,-
C *+%//0"%+1
C $2(3"$-0,%4 (stream socket"
C $2(3"/50%4 (datagram socket"
'o use these s(m+olic constants and
declarations, include the header file
6inso!.h or 6inso!7.h8
or
#include
#include
<winsock.h>
<winsock2.h>
&r. 1.2. 3eung 1
{
- Simple and Complete /0ample
% 4n this section, $e implement the follo$ing client*
ser#er application using 'CP:
'he client sends the message 7Lello7 to the
ser#er.
'he ser#er sends this message +ack to the client.
'hen +oth the client and ser#er are terminated.
% Client Program
#include
#include
<stdio.h>
<winsock2.h>
#define
main()
WSVERS MAKEWORD(2,0)
WSADATA
SOCKET
struct sockaddr_in
char
buf[5],
int
wsadata;
s;
ServerAddr;
*message="Hello",
*bptr;
i, buflen, count;
/* call WSAStartup() and socket() */
WSAStartup ( WSVERS , &wsadata ) ;
s = socket ( PF_INET , SOCK_STREAM , 0 );
&r. 1.2. 3eung ,
/*
call connect() to connect to the server */
ServerAddr.sin_family = AF_INET ;
ServerAddr.sin_port = htons(2000) ;
ServerAddr.sin_addr.s_addr =
htonl(2662729535);
connect(s, (struct sockaddr *)
&ServerAddr, sizeof(ServerAddr));
/* call send() to send a message to the
server */
send(s, message, strlen(message), 0);
/* call recv() to receive a message from
the server */
bptr = buf; buflen = 5;
recv(s, bptr, buflen, 0);
/* Echo the received message from the
server */
for (i=0; i<5; ++i){
printf("%c", buf[i]);
}
printf("\n%s\n", "Bye bye!");
/* call closesocket() */
closesocket(s);
/* call WSACleanup() */
WSACleanup();
}
&r. 1.2. 3eung
% Ser#er Program
#include
#include
#define
main()
{
<stdio.h>
<winsock2.h>
WSVERS MAKEWORD(2,0)
WSADATA
SOCKET
struct sockaddr_in
char
int
wsadata;
s, nsock;
ServerAddr,
ClientAddr;
buf[5], *bptr;
i, buflen, count;
/* call WSAStartup() */
WSAStartup ( WSVERS , &wsadata ) ;
/* call socket() */
s = socket ( PF_INET , SOCK_STREAM , 0 );
/* call bind() */
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(2000);
ServerAddr.sin_addr.s_addr =
htonl(INADDR_ANY);
bind ( s, (struct sockaddr *) &ServerAddr
, sizeof(ServerAddr) );
/* call listen() */
listen(s,1);
&r. 1.2. 3eung :
/* call accept() */
i = sizeof ( ClientAddr );
nsock = accept (s, (struct sockaddr
*) &ClientAddr , &i );
/* call recv() to receive a message from
the client */
bptr = buf; buflen = 5;
recv ( nsock , bptr , buflen , 0 );
/* call send() to send the message
back to the client */
send ( nsock, buf, strlen(buf), 0);
/* call closesocket() */
closesocket ( nsock );
closesocket ( s );
/* call WSACleanup() */
WSACleanup();
}
&r. 1.2. 3eung !
% Remarks
For clarit(, the a+o#e t$o programs do not
check an( possi+le error in net$ork
communication (e.g., $hether the remote
ser#er can +e reached".
% 4n practice, a sophisticated program
should check all the possi+le errors.
4f a program has to recei#e a large message,
it should call rev() repeatedl( until the
entire message has +een recei#ed. 'he
details are e0plained in the ne0t chapter.
&r. 1.2. 3eung 6
'utorial Pro+lems
% Esing the net$ork +(te order, ho$ is the 4P
address 1!).1),.A.1 stored in the memor(M
% State the items in a generic endpoint address.
% State the items in a 'CP>4P endpoint address.
% 2hat is the relationship +et$een the a+o#e t$o
addressesM
% - 2inSock application has to call +oth
#$%$tart&p() and so!et() for initialiHation.
2hat is the difference +et$een these t$o
functionsM
% 2hen should an application call loseso!et()9
% 2hen should an application call
#$%(lean&p()9
% 2hat is the main purpose of 'ind() M
% Should a 'CP client call 'ind()9
% Should a 'CP ser#er call 'ind()9
% Consider a 'CP client*ser#er application.
Should the client call onnet() M
Should the ser#er call onnet() M
&r. 1.2. 3eung A
% 2hat are the main purposes of listen() M
% 2hat are the main purposes of aept() M
% 4n different e0ecutions of a ser#er, is its port
num+er al$a(s the sameM
% 4n different e0ecutions of a client, is its port
num+er al$a(s the sameM
% 2hen (ou $rite a ser#er program, should (ou
assign a port num+er to itM
% 2hen (ou $rite a client program, should (ou
assign a port num+er to itM
% - program calls send() to send a message.
2hen the call returns, does it mean that the
entire message has +een sent outM
% - program calls rev() to recei#e a message.
2hen the call returns, does it mean that the
entire message has +een recei#edM
% 4f (ou $ant to de#elop a ser#er that can store
199 $aiting re8uests, ho$ $ould (ou doM
&r. 1.2. 3eung )