Sockets III

advertisement
Ports
• Port - A 16-bit number that identifies the
application process that receives an incoming
message.
• Reserved ports or well-known ports (0 to 1023)
Standard ports for well-known applications.
Telnet (23), ftp(21), http (80).
See /etc/services file on any UNIX machine for listing of services on
reserved ports.
• Ephemeral ports (1024-65535)
For ordinary user-developed programs.
Associations
• A socket address is the triple:
{protocol, local-IP, local-port}
For example,
{tcp, 130.245.1.44, 23}
• An association is the 5-tuple that completely specifies
the two end-points that comprise a connection:
{protocol, local-IP, local-port, remote-IP, remote-port}
For example:
{tcp, 130.245.1.44, 23, 130.245.1.45, 1024}
Associations….
• A half-association is
{protocol, local-IP, local-port}
or
{protocol, remote-IP, remote-port}
which specify each half of the connection.
• The half-association is also called a socket or a
transport address.
UDP Daytime Client and Server
• Server waits for requests on a known port.
• Client sends a UDP request to server.
• Server responds with daytime info.
• No connection establishment!
• No reliability!
UDP Client
#include
"unp.h"
int main(int argc, char **argv)
{
int sockfd, n, servlen;
char req[10], recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if( argc != 2 )err_quit(“usage : gettime <IP address>”);
/* Create a UDP socket */
sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
/* Specify server’s IP address and port */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(13); /* daytime server port */
Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
/* Send message to server requesting date/time */
strcpy(req, “GET_TIME”);
Sendto(sockfd, req, strlen(req), 0, (struct sockaddr *)&servaddr,
sizeof(servaddr));
/* Read date/time from the socket */
servlen = sizeof(servaddr);
n= Recvfrom(sockfd, recvline, MAXLINE, 0, (struct sockaddr
*)&servaddr, &servlen);
recvlen[n] = 0;
printf(“%s”, recvlen);
close(sockfd);
}
UDP Server
#include
#include
"unp.h"
<time.h>
int main(int argc, char **argv)
{
int
sockfd, clilen;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE], req[REQ_LEN];
time_t ticks;
/* Create a socket */
sockfd = Socket(AF_INET, SOCK_DGRAM, 0);
/* Initialize server’s address and well-known port */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family
= AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port
= htons(13);
/* daytime server */
/* Bind server’s address and port to the socket */
Bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
for ( ; ; ) {
/* Wait for client request */
len = sizeof(cliaddr);
n = Recvfrom( sockfd, req, REQ_LEN, 0, &cliaddr, &clilen);
/* Retrieve the system time */
ticks = time(NULL);
snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));
/* Send to client*/
Sendto(sockfd, buff, strlen(buff), 0, &cliaddr, clilen);
}
}
TCP Connection Sequence
Server
Client
socket()
bind()
socket()
listen()
connect()
3-way handshake
accept()
write()
data
read()
data
write()
read()
close()
EOF
read()
close()
UDP Connection Sequence
Server
Client
socket()
socket()
bind()
sendto()
data
recvfrom()
data
recvfrom()
close()
sendto()
Socket API summary
•
int socket( int family, int type, int protocol)
Creates a network plug point that enables the client/server to communicate
•
int connect( int sockfd, const struct sockaddr
*servaddr, socklen_t addrlen)
Enables a client to connect to a server.
•
int bind( int sockfd, const struct sockaddr *myaddr,
socklen_t addrlen)
Allows a server to specify the IP address/port_number associated with a socket
Socket API summary…
• int listen(int sockfd, int backlog)
Allows the server to specify that a socket can be used to accept
connections.
• int accept(int sockfd, struct sockaddr
*client_addr, socklen_t *addrlen)
Allows a server to wait till a new connection request arrives.
• int close(int sockfd)
Terminates any connection associated with a socket and releases the
socket descriptor.
Socket API summary…
• int read(int sockfd, void *buf, int count);
Read data from a TCP connection.
• int write(int sockfd, void *buf, int count)
Write data to a TCP connection.
• int sendto(int sockfd, void *msg, … )
Send a UDP message on a socket to specified destination
• int recvfrom(int sockfd, void *buf, … )
Recv a UDP message on a socket along with address of sending source.
• Similarly check man pages for sendmsg(), recvmsg().
Converting Between Address formats
• From ASCII to numeric
– “130.245.1.44”  32-bit network byte ordered value
– inet_aton(…) with IPv4
– inet_pton(…) with IPv4 and IPv6
• From numeric to ASCII
–
–
–
–
32-bit value  “130.245.1.44”
inet_ntoa(…) with IPv4
inet_ntop(…) with IPv4 and IPv6
Note – inet_addr(…) obsolete
• cannot handle broadcast address “255.255.255.255”
(0xFFFFFFFF)
Download