Upload
others
View
33
Download
1
Embed Size (px)
Citation preview
NetworkProgrammingMinicourse
TCPSockets
• Connec6on‐oriented– Fulltwo‐waydatatransfer
• Reliabledelivery• Overhead– Setup,teardownofconnec6ons
UDPSockets
• Connec6on‐less(datagrams)• Eachpacketisindependent• Lessoverhead,notreliable
Crea6ngSockets
ImportantNetworkStructsstruct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next;
};
NetworkStructs(cont’d)// all sockaddr structs are cast to this in network calls that // call for it. struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol address
};
// used for ipv4. struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8];
};
getaddrinfo() int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **servinfo);
• Firstthreeparametersareinputparams• Fourthparameterwillpopulatedbythefunc6on• Getsyoutheinfoyouneedabouttheremoteendoftheconnec6on• servinfoactuallysimulatesalinkedlistviatheai_nextfield,but
don’tworryaboutit;justuseservinfodirectlyasasingleaddrinfostruct
InputParameters
• node:domainname/ipaddress– “localhost”,“127.0.0.1”
• service:port– “5555”,“1337”
• hints:socketconfigura6onop6ons– hints.ai_family:AF_UNSPEC/AF_INET/AF_INET6– hints.ai_socktype:SOCK_DGRAM/SOCK_STREAM
• SOCK_DGRAMisUDP,SOCK_STREAMisTCP
– hints.ai_flags:ignorethis
ResultsofFunc6on
• int:actualreturnvalue– usedtoindicatesuccess/failure
• servinfo:populatedbygetaddrinfo() call– containstheinfoyouneedtocreateasocket
socket()
int socket(int domain, int type, int protocol);
• Takesinconfigura6onparameters– Thesewillbeinservinfoaaergetaddrinfo() – Couldalsohardcodeifyoureallywant
• Reservesafiledescriptor– Usedtoread/writeoverthenetworkconnec6on
InputParameters
• domain– AF_INET/AF_INET6– use(*servinfo)‐>ai_familyaaerservinfoispopulatedbygetaddrinfo()
• type– SOCK_STREAM/SOCK_DGRAM– (*servinfo)‐>ai_socktype
• protocol– (*servinfo)‐>ai_protocol
ReturnValue
• Filedescriptorforconnec6on• Sameasafiledescriptorforafileondisk
• Canread,write,close,shutdown– Moreontheseinfutureslides
• <0iferror
QuickCaveats(applytoallnetworkfunc6ons)
• Remembertoerrorcheckreturnvalues• Remembertodoanynecessaryvalida6on
• LookatBeej’sNetworkProgrammingguideforexamplesoferrorchecking
Somecode…
Server‐sideCalls
bind()
int bind(int sockfd, struct sockaddr *myaddr, int addrlen); • Reservesaporttolistenon,andspecifiesitslocalipaddress– forourpurposes,thisipaddresswillalwaysbelocalhost(127.0.0.1)
• Connectsthesocketfdwiththatreservedport• Returns<0onerror
InputParameters
• sockfd– thefiledescriptorreturnedbysocket()
• myaddr– theipaddressandporttobindto– (*servinfo)‐>ai_addr
• addrlen– thelength(inbytes)oftheipaddress– (*servinfo)‐>ai_addrlen
listen()
int listen(int sockfd, int backlog);
• Tellsthesockettolistenforconnec6ons• Callaaerbind()6esthesockettoaport• Returns<0onerror
InputParameters
• sockfd– thefiledescriptorreturnedfromsocket() – sameaspassedintobind()
• backlog– maximumnumberofwai6ngconnec6onsthatwillbequeued
– notimportantforourpurposes,>10isplenty
accept()
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
• Calledaaerlisten() • Acceptsanincomingconnec6onrequestfromaclientprocess
• Probablythetrickiestofthesocketfunc6ons
Parameters
• sockfd– youguessedit:thesamesocketfdyouusedforbind() andlisten()
• addr– apointertoastructsockaddr– willbepopulatedbyaccept()
• similartousageofservinfoingetaddrinfo()
• addrlen– reallyjustpointstoanintegersayingthemaxsizefortheclient’sipaddress
– accept() willchangetheintegerifitusesashorteripaddress
accept() Usage
• accept() blocks!• Whenyoucallaccept()…
– Yourprogramblocks,wai6ngforaclienttocallconnect() • We’llshowyouhowtouseconnect() inafewslides
• Whenaclientconnect()s…– accept() returnsanewsocketfiledescriptorfortheconnec6ontotheclient
– Thisfdisboundtoarandomport,and…– addrispopulatedwiththeinfoabouttheotherside– Youdon’tactuallyneedtouseaddr,sinceyoucanjustread/writeonthenewfiledescriptor
Code!
Client‐sideCalls(TCP)
Simplerthanserver‐side!
connect()
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
• Connectstoaserverthatiswai6ngonanaccept()call
• Returns<0onerror
Parameters
• sockfd– Yup,thefiledescriptorreturnedfromsocket()
• serv_addr– informa6onabouttheservertoconnectto– (*servinfo)‐>ai_addr
• addrlen– length(bytes)ofserveraddressstructure– (*servinfo)‐>ai_addrlen
That’sit!(fortheTCPclient)
SendingandReceiving
send()
int send(int sockfd, const void *msg, int len, int flags);
• usetosenddataoverastreamsocket
• returnsthe number of bytes actually sent
Parameters
• sockfd:thesocket• msg– apointertothedatatosend
• len– lengthofdatatosend
• flags– don’tworryaboutthis;justsetto0
ReturnValue• Numberofbytesactuallysent– ‐1onerror
• Maybelessthanlen!
• Forthisreason,send()needstobecalledinalooptomakesureeverythingissent
recv()
int recv(int sockfd, void *buf, int len, int flags); • Forreadingoverastreamsocket• Blocksun6lsomethingarrives• Returnsthenumberofbytesread– 0ifconnec6onisremotelyclosed– ‐1onerror
Parameters
• sockfd• buf– bufferthatthedatawilbereadinto
• len– maximumlengthofdatatoread– neversetthisgreaterthanthesizeofthebuffer
• flags– forourpurposes,0
sendto()
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, socklen_t tolen);
• Fordatagram(UDP)socketsending
Parameters
• Firstfour–exactsameaswithsend() • to– remoteaddresstosendto
– (*servinfo)‐>ai_addr• tolen– lengthofremoteaddress
– (*servinfo)‐>ai_addrlen
ReturnValue
• Numberofbytessent,0onerror• Sendinaloop
recvfrom()
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
• Fordatagram(UDP)socketreceiving
Parameters
• Firstfour–sameasrecv()• from– recvfrom() populatestoholdaddressofsender
• fromlen– recvfrom() setstolengthof“from”
ReturnValue
• Numberofbytesread– ‐1onerror
close(), shutdown()
• Forkillingsockets• Justuseclose(sockfd) – ThisisjustthenormalUNIXclose() calltocloseafiledescriptor
Examples
• Thereareexcellentandcomprehensivecodeexamples(aswellasexplana6onsofeverythinghere)inBeej’sGuidetoNetworkProgramming
• hrp://beej.us/guide/bgnet/
Addi6onalInfo
select() int select (int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
• Informsyouwhenanyofanumberofsocketshaveinforma6onforreading
• Allowsyoutomonitoranumberofconnec6onsatonce,andevenacceptnewconnec6ons,withoutblockingonanyindividualone
• Usefultoavoidopeninganewthreadforeachconnec6on(hinthint…)
Parameters• numfds
– thevalueofthehighestfiledescriptorplusone– keeparunningtally
• readfds– asetoffiledescriptorsyouwanttoreadon
• writefds– asetoffiledescriptorsyouwanttowriteon
• excepsds– don’tworryaboutthis
• 6meout– max.6metowaitbeforereturning– settoNULLtoblockindefinitely
• thisisprobablywhatyouwanttodo
ReturnValue
• Thenumberoffiledescriptorsready,or‐1onerror
UsefulMacros
• Usedformanagingfd_sets• FD_SET(int fd, fd_set *set)
– Addanfdtoanfd_set• FD_CLR(int fd, fd_set *set)
– Removeanfdfromanfd_set• FD_ISSET(int fd, fd_set *set)
– Checkwhetherfdisset– Usedonceselect()returnstoseeifthefdisreadyforreading/wri6ng
• FD_ZERO(fd_set *set) – Clearanfd_set
SohowdoIuseselect()?
Tips
• Addyouraccept()‐ingfdtothefd_setyouselect() on – thatwayyoudon’thavetoblockonaccept()
ByteOrder
• ntohs(), ntohl(), htons(), htonl() • “networktohostshort”,“networktohostlong”,“hostto
networkshort”,“hosttonetworklong”
• Makessurethatallinfoissentoverthewireinthesamebyteorder
• Callhton()beforesendingdataoverthewire• Callntoh()aaerreadingdataoffofthewire