Upload
ursa
View
27
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Socket Programming in C. CNT4007C, CISE dept. University of Florida (Slides Adapted on J örn Altmann‘s Slides ). Questions that will be Addressed. What mechanisms are available for a programmer who writes network applications? - PowerPoint PPT Presentation
Citation preview
Socket Programming in C
CNT4007C, CISE dept.University of Florida
(Slides Adapted on Jörn Altmann‘s Slides)
CNT4007C 2
Questions that will be Addressed
What mechanisms are available for a programmer who writes network applications?How to write a network application that sends packets between hosts (client and server) across an IP network?Answer: socket API
Client ServerIP Network
CNT4007C 3
Socket ProgrammingTable of Contents1. Network Application Programming Interface
: Sockets and Internet Sockets2. Network Programming Tips3. Client-Server Architecture4. Example: Client Programming5. Example: Server Programming6. Network Programmer’s Mistakes
CNT4007C 4
Layers of the IP Protocol Suite
Link Layer
Transport Layer
Network Layer
Application Layer
Link Layer
Transport Layer
Network Layer
Application Layer
Ethernet
e.g. ftp
e.g. TCP, UDP
e.g. IP
CNT4007C 5
Protocol Suite Location Internet Protocol Layer
Link Layer
Transport Layer (TCP, UDP)
Network Layer (IP)
Application Layer
Network Card &Device Driver
(e.g. Ethernet card)
Operating System(e.g. Unix)
Applications(e.g. browser, game, ftp)
Application ProgrammingInterface (API)
(e.g. network API)
Interface to the Network Card
Location
CNT4007C 6
Network APIOperating system provides Application Programming Interface (API) for network applicationAPI is defined by a set of function types, data structures, and constantsDesirable characteristics of the network interface
Simple to use Flexible
independent from any application allows program to use all functionality of the network
Standardized allows programmer to learn once, write anywhere
Application Programming Interface for networks is called socket
CNT4007C 7
SocketsSockets provide mechanisms to communicate between computers across a network
There are different kind of sockets DARPA Internet addresses (Internet Sockets) Unix interprocess communication (Unix Sockets) CCITT X.25 addresses and many others
Berkeley sockets is the most popular Internet Socket runs on Linux, FreeBSD, OS X, Windows fed by the popularity of TCP/IP
CNT4007C 8
Internet SocketsSupport stream and datagram packets (e.g. TCP, UDP, IP)
Is Similar to UNIX file I/O API (provides a file descriptor)
Based on C, single thread model does not require multiple threads
CNT4007C 9
Types of Internet Sockets
Different types of sockets implement different communication types (stream vs. datagram)Type of socket: stream socket connection-oriented two way communication reliable (error free), in order delivery can use the Transmission Control Protocol (TCP) e.g. telnet, ssh, httpType of socket: datagram socket connectionless, does not maintain an open
connection, each packet is independent can use the User Datagram Protocol (UDP) e.g. IP telephonyOther types exist: similar to the one above
CNT4007C 10
Network Programming TipsByte Ordering NamingAddressing
CNT4007C 11
Byte Ordering of Integers
Different CPU architectures have different byte ordering
D3
high-order byte low-order byte
memoryaddress A
memoryaddress A
+1
Stored at little-endian computer
Stored at big-endian computer
low-order byte high-order byte
F2Integer representation (2 byte)
CNT4007C 12
Message in Memory ofof big-endian ComputerMessage is sent
across Network 48 45 4C 4C 6F 01 00
Byte Ordering ProblemQuestion: What would happen if two computers with different integer byte ordering communicate?
Message is: [Hello,1]
Message is: [Hello,512]
Proc
ess in
g
48 45 4C 4C 6F 01 00
Message in Memory oflittle-endian Computer Pr
oces
s ing
Answer:Nothing if they do not exchange integers!But: If they exchange integers, they would get the wrong order of bytes, therefore, the wrong value!
Example:
CNT4007C 13
Byte Ordering SolutionThere are two solutions if computers with different byte ordering system want to communicate
They must know the kind of architecture of the sending computer(bad solution, it has not been implemented)
Introduction of a network byte order. The functions are:
uint16_t htons(uint16_t host16bitvalue)uint32_t htonl(uint32_t host32bitvalue)uint16_t ntohs(uint16_t net16bitvalue)uint32_t ntohs(uint32_t net32bitvalue)
Note: use for all integers (short and long), which are sent across the network
Including port numbers and IP addresses
CNT4007C 14
Network Programming TipsByte Ordering NamingAddressing
CNT4007C 15
Naming and Addressing
Host name identifies a single host (see Domain Name
System slides) variable length string (e.g. www.berkeley.edu) is mapped to one or more IP addresses
IP Address written as dotted octets (e.g. 10.0.0.1) 32 bits. Not a number! But often needs to be
converted to a 32-bit to use.Port number identifies a process on a host 16 bit number
CNT4007C 16
Client-Server Architecture
Client requests service from serverServer responds with sending service or error message to client
Client Serverrequest
response
CNT4007C 17
Simple Client-Server Example
Client Serverrequest
response
socket()connect()send()
recv()close()
socket()bind()listen()accept()
recv()
send()
recv()close()
Connectionestablishment
Data response
Data request
End-of-file notification
CNT4007C 18
Example: Client Programming
Create stream socket (socket() )Connect to server (connect() )While still connected: send message to server (send() ) receive (recv() ) data from server and
process itClose TCP connection and Socket (close())
CNT4007C 19
socket(): Initializing SocketGetting the file descriptorint chat_sock;if ((chat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket"); printf("Failed to create socket\n"); abort ();
}
1.parameter specifies protocol/address family2.parameter specifies the socket type
Other possibilities: SOCK_DGRAM3.parameter specifies the protocol.
0 means protocol is chosen by the OS.
CNT4007C 20
IP Address Data Structurestruct sockaddr_in { short int sin_family; // Address family unsigned short int sin_port; // Port number struct in_addr sin_addr; // Internet address unsigned char sin_zero[8];};
struct in_addr { unsigned long s_addr; // 4 bytes };
Padding of sin_zeros: struct sockaddr_in has same size as struct sockaddr
CNT4007C 21
connect(): Making TCP Connection to Serverstruct sockaddr_in sin;
struct hostent *host = gethostbyname (argv[1]);unsigned int server_address = *(unsigned long *) host->h_addr_list[0];unsigned short server_port = atoi (argv[2]);
memset (&sin, 0, sizeof (sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = server_address;sin.sin_port = htons (server_port);
if (connect(chat_sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) { perror("connect"); printf("Cannot connect to server\n"); abort();}
CNT4007C 22
send(): Sending Packetsint send_packets(char *buffer, int buffer_len) {
sent_bytes = send(chat_sock, buffer, buffer_len, 0); if (send_bytes < 0) { perror (“send"); } return 0;
}
Needs socket descriptor,Buffer containing the message, andLength of the messageCan also use write()
CNT4007C 23
Receiving Packets:Separating Data in a Stream
Use records (data structures) to partition the data stream
B
Fixed length record
Fixed length record
0 1 3
C
2 94 6 87
D
5
A
receive buffer
slide through
CNT4007C 24
Receiving Packetsint receive_packets(char *buffer, int buffer_len, int *bytes_read){
int left = buffer_len - *bytes_read; received = recv(chat_sock, buffer + *bytes_read, left, 0); if (received < 0) { perror (“recv"); } if (received <= 0) { return close_connection(); } *bytes_read += received; while (*bytes_read > RECORD_LEN) { process_packet(buffer, RECORD_LEN); *bytes_read -= RECORD_LEN; memmove(buffer, buffer + RECORD_LEN, *bytes_read); } return 0;}
Can also use read()
buffer
*bytes_read
buffer_len
CNT4007C 25
Server Programming: Simple
Create stream socket (socket() )Bind port to socket (bind() )Listen for new client (listen() )While accept user connection and create a
new socket (accept() ) data arrives from client (recv() ) data has to be send to client (send() )
CNT4007C 26
bind(): Assign IP and Portstruct sockaddr_in sin;
struct hostent *host = gethostbyname (argv[1]);unsigned int server_address = *(unsigned long *) host->h_addr_list[0];unsigned short server_port = atoi (argv[2]);
memset (&sin, 0, sizeof (sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = server_address;sin.sin_port = htons (server_port);
if (bind(chat_sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) { perror("bind"); printf("Cannot bind server application to network\n"); abort();}
CNT4007C 27
bind():bind() tells the OS to assign a local IP address and local port number to the socket.Many applications let the OS choose an IP address.
Use wildcard INADDR_ANY as local address in this case.At server, user process must call bind() to assign a portAt client, bind() is not required since OS may assign available port and IP address The server will get the port number of the client
through the UDP/TCP packet headerNote: Each application is represented by a server port number
CNT4007C 28
listen(): Wait for Connections
int listen(int sockfd, int backlog);
Puts socket in a listening state, willing to handle incoming TCP connection request.Backlog: number of TCP connections that can be queued at the socket.
CNT4007C 29
Server Example#include <stdio.h>#include <string.h> #include <unistd.h> #include <pthread.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h>
#define MYPORT 3490 // the port users will be connecting to #define BACKLOG 10 // how many pending connections queue will hold
int main(void) { int sockfd, new_fd; // listen on sockfd, new connection on new_fd struct sockaddr_in my_addr; // my address information struct sockaddr_in their_addr; // connector's address information int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1);
}
my_addr.sin_family = AF_INET; // host byte ordermy_addr.sin_port = htons(MYPORT); // short, network byte order my_addr.sin_addr.s_addr = INADDR_ANY; // auto. filled with local IP memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct
CNT4007C 30
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1);
}
if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1);
}
while(1) { // main accept() loop sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{ perror("accept"); continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send");
close(new_fd); }return 0;
}
CNT4007C 31
Client Example#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>#include <netdb.h>
#define PORT 3490 // the port client will be connecting to #define MAXDATASIZE 100 // max number of bytes we can get
// at once int main(int argc, char *argv[]) {
int sockfd, numbytes; char buf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in their_addr; // server's address information
if (argc != 2) { fprintf(stderr,"usage: client hostname\n"); exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info perror("gethostbyname"); exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1);
}
CNT4007C 32
their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(PORT); // short, network byte order their_addr.sin_addr = *(struct in_addr *)*he->h_addr_list; // already network byte order memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1){ perror("connect"); exit(1);
}
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) { perror("recv"); exit(1);
}
buf[numbytes] = '\0'; printf("Received: %s",buf); close(sockfd); return 0;
}
CNT4007C 33
I/O Blockingsocket();bind() ;listen();while
accept();recv() ;send() ;
Simple server has blocking problem Suppose 5 connections accepted. Suppose next accept() blocks. Other connections cannot send and receive. Cannot get keyboard input either.
CNT4007C 34
select() :I/O Multiplexingwaits on multiple file descriptors and timeoutreturns when any file descriptor is ready to be read or written or indicate an error, or timeout exceeded
advantages simple application does not consume CPU cycles while
waitingdisadvantages does not scale to large number of file descriptors
CNT4007C 35
Example: Server Programming
create stream socket (socket() )Bind port to socket (bind() )Listen for new client (listen() )While Wait for (select() )
(depending on which file descriptors are ready) accept user connection and create a new
socket (accept() ) data arrives from client (recv() ) data has to be send to client (send() )
CNT4007C 36
Server: Alternative Ways of Handling Many Clients
Forking a new process for each client: fork()But, creating new process is expensive.Multithreaded implementation: have one thread handling each client.Thread is like a process but light-weighted.
CNT4007C 37
Network Programmer’s Mistakes
byte orderingseparating records in streamsuse of select()misinterpreting the project specificationnot knowing all available system calls
CNT4007C 38
There are more System CallsDepends on communication type Datagram sockets use recvfrom() and
sendto() for receiving and sending dataClosing connection: close(), shutdown()Convenient functions (on UNIX) inet_aton, inet_ntoa inet_pton, inet_ntop
CNT4007C 39
Compile & RunCompile Server
$sand>gcc –o server server.c –lnsl –lsocket –lpthread
Client$rain>gcc –o client client.c –lnsl –lsocket
Run Server
$sand>./server Client
$rain>./client sand.cise.ufl.edu
CNT4007C 40
Literatureshort tutorial: Beej's Guide to Network Programming http://www.ecst.csuchico.edu/~beej/guide/net/ http://beej.us/guide/bgnet/
Unix Network Programming, volumes 1 and 2 by W. Richard Stevens. Published by Prentice Hall; ISBNs for volumes 1 and 2: 013490012X, 0130810819.Advanced Programming in the Unix Environment by W. Richard Stevens. Published by Addison Wesley. ISBN 0201563177. man pages on a Unix computer
CNT4007C 41
Java ReferencesJava Socket Programming Tutorials Textbook
p159~p177 http://perleybrook.umfk.maine.edu/slides/
spring%202004/cos420/Socket_Programming.ppt
http://www.cs.rpi.edu/academics/courses/netprog/c09.html
http://www.cs.odu.edu/~cs476/SocketProgramming/java/java.htm
http://zerioh.tripod.com/ressources/sockets.html