Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.
-
date post
22-Dec-2015 -
Category
Documents
-
view
272 -
download
0
Transcript of Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.
![Page 1: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/1.jpg)
Overview
Introduction to UNIX UNIX commands Text editors C/C++ compiling
Sockets
![Page 2: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/2.jpg)
UNIX –Getting Started
Where/How? Install linux on your home machine (dedicated machine or dual boot)
Getting familiar with linux is really useful even beyond this class Work on the sun machines in the pod
Log in and use the X-windows interface; each window will give you a unix shell
Log in to bingsuns from home (preferrably using a secure shell client like puttyssh)
Run VNC from your windows machine to get a unix work area (from a server running on bingsuns); help on class webpage
This is a brief tutorial; many more detailed ones on class page
![Page 3: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/3.jpg)
UNIX Commandschange directory: cd dirnamechange to home dir: cdcopy a file: cp old newmove (rename) a file: mv old newremove a file: rm fnameprint working directory: pwda new directory: mkdir newget the manual for command: man commandtype contents of a file: cat filenameshow by screens: less filename
somecommand option argument|lesscount lines, words, chars: wc filenamefind a file in current dir:
find . –name foo.bar -printsearch for something in files:
grep “some thing” filename grep something /some/path/*.cgrep –r something /some/folder
![Page 4: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/4.jpg)
Text Editors in UNIX
VI (Visually Improved). Example: vi filename.c Enter :q to quit.
Pico Pico is similar to Pine mail user agent. Good for first time UNIX users.
Emacs GNU Emacs Manual:
http://www.delorie.com/gnu/docs/emacs/emacs_toc.html XEmacs
A version for X-Windows.
Some exotic editors for linux out there now (anjuta, kwrite …)
![Page 5: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/5.jpg)
Compilng C/C++ and Java
Compiling with gcc
gcc –o tcpClient tcpClient.c otherFile.c –lnsl
-lsocket Use g++ in the same way for C++ files You should not ignore warnings.
Don’t forget –lnsl –lsocket on unix machines; they link in the name services library and the sockets library.
On Linux, you don’t need –lsocket
![Page 6: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/6.jpg)
Sockets Programming
Socket to me!
![Page 7: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/7.jpg)
Outline
What is a socket? Ports
Preliminaries Data structures and conversion DNS resolution
TCP server with example UDP server with example Select() for concurrent servers
![Page 8: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/8.jpg)
Network Application Programming Interface (API) The services provided (often by the operating
system) that provide the interface between application and protocol software.
ApplicationApplication
Network APINetwork API
TCPTCP UDPUDP Etc…Etc…
SocketsDo this
![Page 9: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/9.jpg)
Socket Basics An end-point for a IP network connection
what the application layer “plugs into” programmer cares about Application
Programming Interface (API) End point determined by two things:
Host address: IP address is Network Layer Port number: is Transport Layer
Two end-points determine a connection: socket pair ex: 128.226.123.101,p21 + 198.69.10.2,p1500 ex: 128.226.123.101,p21 + 198.69.10.2,p1499
![Page 10: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/10.jpg)
Aside -- Ports
Numbers (vary by OS): 0-1023 “reserved”, must be root to use 1024 - 5000 “ephemeral” however, many systems allow > 3977 ports
(50,000+ common) Well-known, reserved services (see /etc/services
in Unix): ftp 21/tcp ssh 22/tcp telnet 23/tcp finger 79/tcp snmp 161/udp
![Page 11: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/11.jpg)
Transport Layer
UDP: User Datagram Protocol no acknowledgements no retransmissions out of order, duplicates possible connectionless
TCP: Transmission Control Protocol reliable (in order, all arrive, no duplicates) flow control connection
![Page 12: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/12.jpg)
Socket Descriptor Data StructureDescriptor TableDescriptor Table
0
1
2
3
4
Family: PF_INETFamily: PF_INETService: SOCK_STREAMService: SOCK_STREAMLocal IP: 111.22.3.4Local IP: 111.22.3.4Remote IP: 123.45.6.78Remote IP: 123.45.6.78Local Port: 2249Local Port: 2249Remote Port: 3726Remote Port: 3726
Family: PF_INETFamily: PF_INETService: SOCK_STREAMService: SOCK_STREAMLocal IP: 111.22.3.4Local IP: 111.22.3.4Remote IP: 123.45.6.78Remote IP: 123.45.6.78Local Port: 2249Local Port: 2249Remote Port: 3726Remote Port: 3726
![Page 13: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/13.jpg)
Preliminaries
![Page 14: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/14.jpg)
Socket Address Structure
struct in_addr { in_addr_t s_addr; /* 32-bit IPv4 addresses */};struct sockaddr_in { unit8_t sin_len; /* length of structure */ sa_family_t sin_family; /* AF_INET */ in_port_t sin_port; /* TCP/UDP Port num */ struct in_addr sin_addr; /* IPv4 address (above) */ char sin_zero[8]; /* unused */}
Are also “generic” and “IPv6” socket structures
![Page 15: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/15.jpg)
Convert the natives! Byte order‘h’ : host byte order ‘n’ : network byte order
‘s’ : short (16bit) ‘l’ : long (32bit)
uint16_t htons(uint16_t);uint16_t ntohs(uint_16_t);
uint32_t htonl(uint32_t);uint32_t ntohl(uint32_t);
In_addr values should be stored in network byte order (common mistake)
![Page 16: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/16.jpg)
Aside – Using DNS server
Sockets use IP addresses to name hosts Use DNS to resolve host names to IP addresses DNS is the “phone book” that maps machine
names to IP addresses Done before Initiating a connection
![Page 17: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/17.jpg)
Using DNS
To find out the IP address of a machine #include <unistd.h>
int gethostname(char *name, int namelen); name : is character array way to store
the name Of the machine with null terminated character.
namelen : size of the chracter array
This function puts the name of the host in name . It returns 0 if ok, -1 if error.
![Page 18: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/18.jpg)
gethostbyname (cont)
#include <netdb.h> struct hostent *gethostbyname(const char *name);- This returns hostent structure with all necessary information related
to host with name .struct hostent { char *h_name; /* canonical name of host*/ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */ };#define h_addr h_addr_list[0]
![Page 19: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/19.jpg)
hostent Address stored in h_addr is in struct
in_addr form. To obtain “.” separated id address we
could use #include <sys/types.h>
#include <sys/socket.h> #include <netinet/in.h>
#include <arpa/inet.h> char *inet_ntoa(const struct in_addr in);
The routine inet_ntoa() returns a pointer to a string in the base 256 notation d.d.d.d.
![Page 20: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/20.jpg)
IP Addresses and how to deal with them ASCII to 32-bit IP:
ina.sin_addr.s_addr =
inet_addr("10.12.110.57"); Also can use inet_aton (ascii to network)
32-bit IP to ASCII a1 = inet_ntoa(ina2.sin_addr); // this is
10.12.110.57 printf("address 1: %s\n",a1);
![Page 21: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/21.jpg)
TCP Client-Serversocket()
bind()
listen()
accept()
Server
socket()
connect()
send()
recv()
Client
(Block until connection)“Handshake”
recv()
send()
Data (request)
Data (reply)
close()End-of-Filerecv()
close()
“well-known”
port
![Page 22: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/22.jpg)
creating a socket()int socket(int family, int type, int protocol);
Create a socket/file descriptor, giving access to transport layer service.
family is one of AF_INET (IPv4), AF_INET6 (IPv6), AF_LOCAL (local Unix), AF_ROUTE (access to routing tables), AF_KEY (new, for encryption)
type is one of SOCK_STREAM (TCP), SOCK_DGRAM (UDP) SOCK_RAW (for special IP packets, PING, etc. Must be root)
setuid bit (-rws--x--x root 1997 /sbin/ping*) protocol is 0 (used for some raw socket options) upon success returns socket descriptor
Integer, like file descriptor Return -1 if failure
![Page 23: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/23.jpg)
bind()-- What is my port??
sockfd is socket descriptor from socket() myaddr is a pointer to address struct with:
port number and IP address if port is 0, then host will pick ephemeral port IP address = INADDR_ANY (unless multiple nics)
addrlen is length of structure returns 0 if ok, -1 on error
EADDRINUSE (“Address already in use”)
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
Assign a local protocol address (“name”) to a socket.
![Page 24: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/24.jpg)
bind() exampleint sd;struct sockaddr_in ma;sd = socket(AF_INET,SOCK_STREAM,0);
ma.sin_family = AF_INET;ma.sin_port=htons(5100);ma.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sd, (struct sockaddr *) &ma, sizeof(ma))!= -1) { …}
![Page 25: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/25.jpg)
listen() – will someone please talk to me?
sockfd is socket descriptor from socket() backlog is maximum number of incomplete
connections historically 5 rarely above 15 on a even moderate Web server!
Sockets default to active (for a client) change to passive so OS will accept connection
int listen(int sockfd, int backlog);
Change socket state for TCP server.
![Page 26: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/26.jpg)
accept()– thank you for calling my port
sockfd is socket descriptor from socket() cliaddr and addrlen return protocol address
from client returns brand new descriptor, created by OS note, if create new process or thread, can
create concurrent server
int accept(int sockfd, struct sockaddr cliaddr, socklen_t *addrlen);
Return next completed connection.
![Page 27: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/27.jpg)
listen/connect() examplestruct sockaddr_in ca;//After bind..listen(sd,5);calen = sizeof(ca);cd = accept(sd,(struct sockaddr *) ca, &calen);
//read and write using cd
![Page 28: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/28.jpg)
connect()
sockfd is socket descriptor from socket() servaddr is a pointer to a structure with:
port number and IP address must be specified (unlike bind()) – how?
addrlen is length of structure client doesn’t need bind()
OS will pick ephemeral port returns socket descriptor if ok, -1 on error
int connect(int sockfd, const struct sockaddr
*servaddr, socklen_t addrlen);
Connect to server.
![Page 29: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/29.jpg)
close()/shutdown – go away!
sockfd is socket descriptor from socket() closes socket for reading/writing
returns (doesn’t block) attempts to send any unsent data socket option SO_LINGER
block until data sent or discard any remaining data
returns -1 if error .
int close(int sockfd);
Close socket for use.
![Page 30: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/30.jpg)
connect() exampleint sd;struct sockaddr_in sa;sd = socket(AF_INET,SOCK_STREAM,0);
sa.sin_family = AF_INET;sa.sin_port=htons(5100);sa.sin_addr.s_addr= htonl(inet_addr(“128.226.123.101”));
if(connect(sd, (struct sockaddr *) &sa, sizeof(sa))!= -1) { …}
![Page 31: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/31.jpg)
Sending and Receiving – talk to me!
int recv(int sockfd, void *buff, size_t mbytes, int flags);
int send(int sockfd, void *buff, size_t mbytes, int flags);
![Page 32: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/32.jpg)
UDP Client-Server
socket()
bind()
recvfrom()
Server
socket()
sendto()
recvfrom()
Client
(Block until receive datagram)
sendto()
Data (request)
Data (reply)
close()
“well-known”
port
- No “handshake”
- No simultaneous close
- No fork() for concurrent servers!
![Page 33: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/33.jpg)
Sending and Receivingint recvfrom(int sockfd, void *buff, size_t mbytes,
int flags, struct sockaddr *from, socklen_t *addrlen);
int sendto(int sockfd, void *buff, size_t mbytes, int flags, const struct sockaddr *to, socklen_t addrlen);
Same as recv() and send() but for addr recvfrom fills in address of where packet
came from sendto requires address of where sending
packet to
![Page 34: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/34.jpg)
getpeername()--Who are you?
It will tell you who is at the other end of a connected stream socket. The synopsis:
#include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *addr,
int *addrlen);
![Page 35: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/35.jpg)
Gethostname() --Who am I?
Returns the name of the computer that your program is running on. You can then use gethostbyname() to determine the IP address of your local machine.
Here's the breakdown:
#include <unistd.h> int gethostname(char *hostname, size_t
size);
![Page 36: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/36.jpg)
Example of Stream Server: echo /* stream server: echo what is received from client */
#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>int main (int argc, char *argv[]){ int s, t, sinlen; struct sockaddr_in sin; char msg[80];
![Page 37: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/37.jpg)
Example of Stream Server: echo
(cont’d) if (argc < 2) { printf (”%s port\n”, argv[0] ); /* input error: need port no! */ return -1;}if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) { /* create
socket*/ perror(”socket”); /* socket error */ return -1;}sin.sin_family = AF_INET; /*set protocol family to Internet */sin.sin_port = htons(atoi(argv[1])); /* set port no. */sin.sin_addr.s_addr = INADDR_ANY; /* set IP addr to any interface */if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ){ perror(”bind”); return -1; /* bind error */}
![Page 38: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/38.jpg)
Example of Stream Server: echo
(cont’d) /* server indicates it’s ready, max. listen queue is 5 */if (listen(s, 5)) { perror (”listen”); /* listen error*/ return -1;}sinlen = sizeof(sin);while (1) {
/* accepting new connection request from client, socket id for the new connection is returned in t */
if ( (t = accept(s, (struct sockaddr *) &sin, &sinlen) ) < 0 ){
perror(”accept ”); /* accpet error */ return -1;
}
![Page 39: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/39.jpg)
Example of Stream Server: echo
(cont’d) printf( ”From %s:%d.\n”, inet_ntoa(sin.sin_addr), ntohs(sin.sin_port) );
if ( read(t, msg, sizeof(msg) ) <0) { /* read message from client */ perror(”read”); /* read error */ return -1;
}if ( write(t, msg, strlen(msg) ) < 0 ) { /* echo message back */
perror(”write”); return -1; /* write error */}/* close connection, clean up sockets */if (close(t) < 0) { perror(”close”); return -1;}
} // not reach belowif (close(s) < 0) { perror(”close”); return -1;}return 0;}
![Page 40: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/40.jpg)
Example of Stream Client: echo /* stream client: send a message to server */#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <unistd.h>#include <stdlib.h>#inlcude <stdio.h>#include <netdb.h>int main (int argc, char *argv[] ){ int s, n; struct sockaddr_in sin; struct hostent *hptr; char msg[80] = ”Hello World!”;
![Page 41: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/41.jpg)
Example of Stream Client: echo (cont’d) if ( argc < 3 ) {
printf ( ”%s host port\n”, argv[0] ); /* input error: need host & port */ return -1;}if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) { /* create socket*/ perror(”socket”); /* socket error */ return -1;}sin.sin_family = AF_INET; /*set protocol family to Internet */sin.sin_port = htons(atoi(argv[2])); /* set port no. */if ( (hptr = gethostbyname(argv[1]) ) == NULL){ fprintf(stderr, ”gethostname error: %s”, argv[1]); return = -1; }memcpy( &sin.sin_addr, hptr->h_addr, hptr->h_length);
![Page 42: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/42.jpg)
Example of Stream Client: echo (cont’d) if (connect (s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ){
perror(”connect”); return -1; /* connect error */}if ( write(s, msg, strlen(msg) +1) < 0 ) { /* send message to server */ perror(”write”); return -1; /* write error */}if ( ( n = read(s, msg, sizeof(msg) ) ) <0) { /* read message from server */ perror(”read”); return -1; /* read error */}printf (” %d bytes: %s\n”, n, msg); /* print message to screen *//* close connection, clean up socket */if (close(s) < 0) { perror(”close”); /* close error */ return -1;}return 0;}
![Page 43: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/43.jpg)
Compiling and Executinggarnet% g++ -o echo-server echo-server.c -lsocket -lnsl
garnet% g++ -o echo-client echo-client.c -lsocket -lnsl
garnet% echo-server 5700 &
garnet% echo-client opal 5700
From 128.226.123.110:32938.
12 bytes: Hello World!
![Page 44: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/44.jpg)
Concurrent Servers
Receive blocks; how do servers that support multiple clients work?
Threaded servers; only a thread blocks Asynchronous receive; receive that doesn’t
block Select() system call lets you test which
sockets have something ready to receive so that you are guaranteed not to block
Examples next time/on class webpage
![Page 45: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/45.jpg)
select
#include <sys/select.h> #include <sys/time.h> int select ( int numfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
Struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
}
![Page 46: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/46.jpg)
select
Void FD_ZERO(fd_set *set) ; Clear all bits in fdset.
Void FD_SET(int fd, fd_set *set) ; Turn on the bit for fd in fdset
Void FD_CLR(int fd, fd_set *set) ; Turn off the bit for fd in fdset
Int FD_ISSET(int fd, fd_set *set) ; Is the bit for fd on in fdset?
![Page 47: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/47.jpg)
Select example#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define STDIN 0 /* file descriptor for standard input */
main() {
struct timeval tv;
fd_set readfds;
tv.tv_sec = 2;
tv.tv_usec = 500000;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds); /* don't care about writefds
and exceptfds: */
select(STDIN+1, &readfds, NULL, NULL, &tv);
if (FD_ISSET(STDIN, &readfds))
printf("A key was pressed!\n");
else printf("Timed out.\n");
}
![Page 48: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/48.jpg)
Extra stuff – probably not interesting
![Page 49: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/49.jpg)
Socket Options
setsockopt(), getsockopt() SO_LINGER
upon close, discard data or block until sent SO_RCVBUF, SO_SNDBUF
change buffer sizes for TCP is “pipeline”, for UDP is “discard”
SO_RCVTIMEO, SO_SNDTIMEO timeouts
![Page 50: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/50.jpg)
Socket Options (TCP)
TCP_KEEPALIVE idle time before close (2 hours, default)
TCP_MAXRT set timeout value
TCP_NODELAY disable Nagle Algorithm
![Page 51: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/51.jpg)
fcntl()
‘File control’ but used for sockets, too Signal driven sockets Set socket owner Get socket owner Set socket non-blocking
flags = fcntl(sockfd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, flags); Beware not getting flags before setting!
![Page 52: Overview Introduction to UNIX UNIX commands Text editors C/C++ compiling Sockets.](https://reader030.fdocuments.net/reader030/viewer/2022033022/56649d775503460f94a59e6c/html5/thumbnails/52.jpg)