180 likes | 967 Views
UNIX Socket Programming CS 6378 Project Reference Book: Unix Network programming: Networking APIs: Sockets and XTI (2nd edition), Prentice Hall >> UNIX System >> Sockets >> System Calls >> TCP Client Server >> UDP Client Server >> Threads Socket API
E N D
UNIX Socket ProgrammingCS 6378 Project Reference Book: Unix Network programming: Networking APIs: Sockets and XTI (2nd edition), Prentice Hall >> UNIX System >> Sockets >> System Calls >> TCP Client Server >> UDP Client Server >> Threads
Socket API • Socket API originated with the 4.2 BSD system released in 1983 • Sockets – A way to speak to other programs using UNIX file descriptors. • A file descriptor is an integer associated with an open file.This can be a network connection • Kinds of Sockets-DARPA Internet addresses(Internet Sockets) , Unix Sockets, X.25 Sockets etc • Types of Internet Sockets • SOCK_STREAM uses TCP (Transmission Control Protocol) Connection oriented and Reliable • SOCK_DGRAM uses UDP (User Datagram Protocol) Connectionless and Unreliable
Structs and Data Handling • A socket descriptor is of type int Byte ordering Most significant byte first – Network byte order (Big Endian) Least significant byte first – Host Byte order ( Little ..) Socket Structures in Network byte order struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address }; struct 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]; // Same size as struct sockaddr };
Convert the Natives struct in_addr { unsigned long s_addr; // 32-bit long, or 4 bytes }; If ina is of type struct sockaddr_in ina.sin_addr.s_addr references the 4-byte IP address (in Network Byte Order • htons() – Host to Network Short • htonl() -- "Host to Network Long" • ntohs() -- "Network to Host Short" • ntohl() -- "Network to Host Long"
IP Addresses • socket01.utdallas.edu 129.110.43.11 • sol2.utdallas.edu 129.110.34.2 etc Other UTD machines for use socket02 – socket06 , sol1 , jupiter Please do not use apache for Network programming inet_addr() converts an IP address in numbers-and-dots notation into unsigned long ina.sin_addr.s_addr = inet_addr(“129.110.43.11”) // Network byte order Also can use inet_aton() -- “ascii to network” int inet_aton(const char *cp,struct in_addr *inp); inet_ntoa returns a string from a struct of type in_addr inet_ntoa(ina.sin_addr) ;
Useful UNIX Commands • netstat –i prints information about the interfaces • netstat –ni prints this information using numeric addresses • loop back interface is called lo and the ethernet interface is called eth0 or le0 depending on the machine • netstat –r prints the routing table • netstat | grep PORT_NO shows the state of the client socket • ifconfig eth0 – Given the interface name ifconfig gives the details for each interface --- Ethernet Addr , inet_addr , Bcast , Mask , MTU • ping IP_addr -- Sends a packet to the host specified by IP_addr and prints out the roundtrip time ( Uses ICMP messages) • traceroute IP_addr -- Shows the path from this host to the destination printing out the roundtrip time for a packet to each hop in between • Tcpdump communicates directly with Data Link layer UDP Packet fail
System Calls • socket() – returns a socket descriptor • int socket(int domain, int type, int protocol); • bind() – What port I am on / what port to attach to • int bind(int sockfd, struct sockaddr *my_addr, int addrlen); • connect() – Connect to a remote host • int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); • listen() – Waiting for someone to connect to my port • int listen(int sockfd, int backlog); • accept() – Get a file descriptor for a incomming connection • int accept(int sockfd, void *addr, int *addrlen); • send() and recv() – Send and receive data over a connection • int send(int sockfd, const void *msg, int len, int flags); • int recv(int sockfd, void *buf, int len, unsigned int flags);
sendto() and recvfrom() – Send and receive data without connection • int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); • int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); • close() and shutdown() – Close a connection Two way / One way • getpeername() – Obtain the peer name given the socket file descriptor • gethostname() – My computer name • int sock_get_port(const struct sockaddr *sockaddr,socklen_t addrlen); Useful to get the port number given a struct of type sockaddr Readn() writen() readline() Read / Write a particular number of bytes Fork() – To start a new process with parents addr space Exec() Load a new program on callers addr space
Client-Server Programming • TCP Client Server Example • Status of client-server before call to accept daytimetcpsrv1.c • Server Client ● connect() listenfd ● Status of clientserver after return from accept ● connect() listenfd ● connfd ●
Status of Client-Server after fork returns Server( Parent) listenfd ● connfd ● Client ● connect() Server ( Child) listenfd● connfd ●
Status of Client Server after parent and Child close appropriate sockets Server ( Parent) listenfd ● Client ● connect() Server(Client) connfd ●
Socket functions of UDP Client Server Socket() Bind() Recvfrom() Socket() Sendto() Blocks until datagram received from a client recvfrom Sendto() Close() UDP Client UDP Server
Threads • Threads are lightweight process which share the process instructions , global variables , open files , signal handlers and signal dispositions , current working directory and user and group Ids • Each thread has its own thread ID , set of Registers, PC and Stack pointer, stack , errno ,signal mask , priority • Basic Thread Functions : Creation and Termination • Int pthread_create(pthread_t *tid,const pthread_attr_t *attr,void *(*func)(void*), void *arg); • Int pthread_join(pthread_t tid,void **status); // Wait for a thread to terminate • pthread_t pthread_self(void); //Returns thread ID of calling thread • Int pthread_detach(pthread_t pid);//We cannot wait for it to terminate, On its termination all resources are released • Void pthread_exit(void *status); • Threads/tcpserv01.c
Thread Synchronization • Shared data can be protected using mutex locks provided by the pthread library • int pthread_mutex_lock(pthread_mutex_t *mptr); • int pthread_mutex_unlock(pthread_mutex_t *mptr); • Threads/example02.c • Can use condition variables for signalling mechanism • int pthread_cond_wait(pthread_cond_t *cptr,pthread_mutex_t *mptr); • int pthread_cond_signal(pthread_cond_t *cptr); • Can also use System semaphores from <semaphores.h> See manual ~syrotiuk/pthreads.cc
References • UNIX Network Programming , Networking APIs: Sockets and XTI : W Richard Stevens • Beej’s Guide to Network Programming www.ecst.csuchico.edu/~beej/guide/net/ • Dr Syrotiuk’s web page with sample networking programs www.utdallas.edu/~syrotiuk/cs6378/work.html