Seminar Topics & Project Ideas On Computer Science Electronics Electrical Mechanical Engineering Civil MBA Medicine Nursing Science Physics Mathematics Chemistry ppt pdf doc presentation downloads and Abstract

Full Version: Communication Networks
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Communication Networks
[attachment=24435]
IP Address/Interfaces
Identifies a host interface (not a host)
Interface: connection between host or router and the physical network link
Hosts may have multiple interfaces
Sending / Receiving Data
With a connection (SOCK_STREAM):
int count = send(sock, &buf, len, flags);
count: # bytes transmitted (-1 if error)
buf: char[], buffer to be transmitted
len: integer, length of buffer (in bytes) to transmit
flags: integer, special options, usually just 0
int count = recv(sock, &buf, len, flags);
count: # bytes received (-1 if error)
buf: void[], stores received bytes
len: max # bytes received
flags: integer, special options, usually just 0
Example of send()
…connect(sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
…char *msg = "Comnet is the course!";
int len, bytes_sent;
len = strlen(msg);
bytes_sent = send(sock, msg, len, 0);
Sending / Receiving Data (cont’d)
Without a connection (SOCK_DGRAM):
int count = sendto(sock, &buf, len, flags, &addr, addrlen);
count, sock, buf, len, flags: same as send
addr: struct sockaddr, address of the destination
addrlen: sizeof(addr)
int count = recvfrom(sock, &buf, len, flags, &addr, &addrlen);
count, sock, buf, len, flags: same as recv
name: struct sockaddr, address of the source
namelen: sizeof(name): value/result parameter
Sending/Receiving notes
send( ) might send only a fraction of the buffer
Need to push the rest
See sendall( ) in Beej’s guide
recv( ) might get several messages together, or a fraction of a message
Need to be able to identify message’s beginning and end
Closing connection
When finished using a socket, the socket should be closed:
status = close(s);
status: 0 if successful, -1 if error
s: the file descriptor (socket being closed)
Closing a socket
closes a connection (for SOCK_STREAM)
frees up the port used by the socket

Skipping the bind()
SOCK_DGRAM:
if only sending, no need to bind. The OS finds a port each time the socket sends a packet
if receiving, need to bind
SOCK_STREAM:
The OS binds a port to the client during connection setup
Dealing with blocking calls
Many of the functions we saw block until a certain event
accept: until a connection comes in
connect: until the connection is established
recv, recvfrom: until a packet (of data) is received
send, sendto: until data is pushed into socket’s buffer
For simple programs, blocking is convenient
What about more complex programs?
multiple connections
simultaneous sends and receives
simultaneously doing non-networking processing
Dealing with blocking (cont’d)
Options:
create multi-process or multi-threaded code
turn off the blocking feature using the fcntl() file-descriptor control function
use the select() function call.
fcntl() function call
int fcntl(int filedes, int cmd, args ...);
status: -1 if error
filedes: argument is an open file descriptor
cmd: specifies the operation to be performed
arg: depends upon the value of cmd
sockfd = socket(PF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
Using select()
What does select do?
can be permanent blocking, time-limited blocking or non-blocking
input: a set of file-descriptors
output: info on the file-descriptors’ status
i.e., can identify sockets that are “ready for use”: calls involving that socket will return immediately
select() function call
int status = select(nfds, &readfds, &writefds, &exceptfds, &timeout);
status: # of ready objects, -1 if error
nfds: 1 + largest file descriptor to check
readfds: set of descriptors to check if read-ready
writefds: set of descriptors to check if write-ready
exceptfds: set of descriptors to check if an exception is registered
timeout: time after which select returns, even if nothing ready - can be 0 or 
To be used with select():
For sets, select uses a structure, struct fd_set
it is just a bit-vector
if bit i is set in [readfds, writefds, exceptfds], select will check if file descriptor (i.e. socket) i is ready for [reading, writing, exception]
Before calling select:
FD_ZERO(&fdvar): clears the structure
FD_SET(i, &fdvar): to check file desc. i
After calling select:
int FD_ISSET(i, &fdvar): boolean returns TRUE iff i is “ready to read”
Standard input (STDIN) is file descriptor 0
Timeout parameter
struct timeval {
int tv_sec; // seconds
int tv_usec; // microseconds
};
Set timeout to NULL for no timeout
Set both to 0 for immediate timeout
Ready to read
Listening port is read-ready if accept won’t block
Closed connections are read-ready but recv( ) returns 0 bytes
Other useful functions
bzero(char* c, int n): 0’s n bytes starting at c
gethostname(char *name, int len): gets the name of the current host
gethostbyname(const char *name): converts host’s name to structure containing long integer
Useful functions (cont.)
gethostbyaddr(char *addr, int len, int type): converts IP hostname to structure containing long integer
inet_aton(const char *cp, struct in_addr *inp): converts dotted-decimal char-string to binary (network order)
inet_ntoa(const struct in_addr in): converts binary to dotted-decimal string