Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network...

49
Network Programming Minicourse

Transcript of Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network...

Page 1: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

NetworkProgrammingMinicourse

Page 2: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

TCPSockets

•  Connec6on‐oriented– Fulltwo‐waydatatransfer

•  Reliabledelivery•  Overhead– Setup,teardownofconnec6ons

Page 3: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

UDPSockets

•  Connec6on‐less(datagrams)•  Eachpacketisindependent•  Lessoverhead,notreliable

Page 4: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Crea6ngSockets

Page 5: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

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;

};

Page 6: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

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];

};

Page 7: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

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

Page 8: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

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

Page 9: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ResultsofFunc6on

•  int:actualreturnvalue– usedtoindicatesuccess/failure

•  servinfo:populatedbygetaddrinfo() call– containstheinfoyouneedtocreateasocket

Page 10: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

socket()

int socket(int domain, int type, int protocol);

•  Takesinconfigura6onparameters– Thesewillbeinservinfoaaergetaddrinfo() – Couldalsohardcodeifyoureallywant

•  Reservesafiledescriptor– Usedtoread/writeoverthenetworkconnec6on

Page 11: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

InputParameters

•  domain– AF_INET/AF_INET6– use(*servinfo)‐>ai_familyaaerservinfoispopulatedbygetaddrinfo()

•  type– SOCK_STREAM/SOCK_DGRAM–  (*servinfo)‐>ai_socktype

•  protocol–  (*servinfo)‐>ai_protocol

Page 12: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ReturnValue

•  Filedescriptorforconnec6on•  Sameasafiledescriptorforafileondisk

•  Canread,write,close,shutdown– Moreontheseinfutureslides

•  <0iferror

Page 13: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

QuickCaveats(applytoallnetworkfunc6ons)

•  Remembertoerrorcheckreturnvalues•  Remembertodoanynecessaryvalida6on

•  LookatBeej’sNetworkProgrammingguideforexamplesoferrorchecking

Page 14: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Somecode…

Page 15: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Server‐sideCalls

Page 16: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

bind()

int bind(int sockfd, struct sockaddr *myaddr, int addrlen); •  Reservesaporttolistenon,andspecifiesitslocalipaddress–  forourpurposes,thisipaddresswillalwaysbelocalhost(127.0.0.1)

•  Connectsthesocketfdwiththatreservedport•  Returns<0onerror

Page 17: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

InputParameters

•  sockfd–  thefiledescriptorreturnedbysocket()

•  myaddr–  theipaddressandporttobindto–  (*servinfo)‐>ai_addr

•  addrlen–  thelength(inbytes)oftheipaddress–  (*servinfo)‐>ai_addrlen

Page 18: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

listen()

int listen(int sockfd, int backlog);

•  Tellsthesockettolistenforconnec6ons•  Callaaerbind()6esthesockettoaport•  Returns<0onerror

Page 19: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

InputParameters

•  sockfd–  thefiledescriptorreturnedfromsocket() – sameaspassedintobind()

•  backlog– maximumnumberofwai6ngconnec6onsthatwillbequeued

– notimportantforourpurposes,>10isplenty

Page 20: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

accept()

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

•  Calledaaerlisten() •  Acceptsanincomingconnec6onrequestfromaclientprocess

•  Probablythetrickiestofthesocketfunc6ons

Page 21: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  sockfd–  youguessedit:thesamesocketfdyouusedforbind() andlisten()

•  addr–  apointertoastructsockaddr–  willbepopulatedbyaccept()

•  similartousageofservinfoingetaddrinfo()

•  addrlen–  reallyjustpointstoanintegersayingthemaxsizefortheclient’sipaddress

–  accept() willchangetheintegerifitusesashorteripaddress

Page 22: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

accept() Usage

•  accept() blocks!•  Whenyoucallaccept()…

–  Yourprogramblocks,wai6ngforaclienttocallconnect() •  We’llshowyouhowtouseconnect() inafewslides

•  Whenaclientconnect()s…–  accept() returnsanewsocketfiledescriptorfortheconnec6ontotheclient

–  Thisfdisboundtoarandomport,and…–  addrispopulatedwiththeinfoabouttheotherside–  Youdon’tactuallyneedtouseaddr,sinceyoucanjustread/writeonthenewfiledescriptor

Page 23: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Code!

Page 24: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Client‐sideCalls(TCP)

Simplerthanserver‐side!

Page 25: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

connect()

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

•  Connectstoaserverthatiswai6ngonanaccept()call

•  Returns<0onerror

Page 26: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  sockfd– Yup,thefiledescriptorreturnedfromsocket()

•  serv_addr–  informa6onabouttheservertoconnectto–  (*servinfo)‐>ai_addr

•  addrlen–  length(bytes)ofserveraddressstructure–  (*servinfo)‐>ai_addrlen

Page 27: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

That’sit!(fortheTCPclient)

Page 28: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

SendingandReceiving

Page 29: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

send()

int send(int sockfd, const void *msg, int len, int flags);

•  usetosenddataoverastreamsocket

•  returnsthe number of bytes actually sent

Page 30: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  sockfd:thesocket•  msg– apointertothedatatosend

•  len–  lengthofdatatosend

•  flags– don’tworryaboutthis;justsetto0

Page 31: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ReturnValue•  Numberofbytesactuallysent–  ‐1onerror

•  Maybelessthanlen!

•  Forthisreason,send()needstobecalledinalooptomakesureeverythingissent

Page 32: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

recv()

int recv(int sockfd, void *buf, int len, int flags); •  Forreadingoverastreamsocket•  Blocksun6lsomethingarrives•  Returnsthenumberofbytesread–  0ifconnec6onisremotelyclosed–  ‐1onerror

Page 33: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  sockfd•  buf– bufferthatthedatawilbereadinto

•  len– maximumlengthofdatatoread– neversetthisgreaterthanthesizeofthebuffer

•  flags–  forourpurposes,0

Page 34: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

sendto()

int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, socklen_t tolen);

•  Fordatagram(UDP)socketsending

Page 35: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  Firstfour–exactsameaswithsend() •  to–  remoteaddresstosendto

–  (*servinfo)‐>ai_addr•  tolen–  lengthofremoteaddress

–  (*servinfo)‐>ai_addrlen

Page 36: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ReturnValue

•  Numberofbytessent,0onerror•  Sendinaloop

Page 37: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

recvfrom()

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

•  Fordatagram(UDP)socketreceiving

Page 38: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters

•  Firstfour–sameasrecv()•  from– recvfrom() populatestoholdaddressofsender

•  fromlen– recvfrom() setstolengthof“from”

Page 39: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ReturnValue

•  Numberofbytesread–  ‐1onerror

Page 40: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

close(), shutdown()

•  Forkillingsockets•  Justuseclose(sockfd) – ThisisjustthenormalUNIXclose() calltocloseafiledescriptor

Page 41: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Examples

•  Thereareexcellentandcomprehensivecodeexamples(aswellasexplana6onsofeverythinghere)inBeej’sGuidetoNetworkProgramming

•  hrp://beej.us/guide/bgnet/

Page 42: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Addi6onalInfo

Page 43: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

select() int select (int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

•  Informsyouwhenanyofanumberofsocketshaveinforma6onforreading

•  Allowsyoutomonitoranumberofconnec6onsatonce,andevenacceptnewconnec6ons,withoutblockingonanyindividualone

•  Usefultoavoidopeninganewthreadforeachconnec6on(hinthint…)

Page 44: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Parameters•  numfds

–  thevalueofthehighestfiledescriptorplusone–  keeparunningtally

•  readfds–  asetoffiledescriptorsyouwanttoreadon

•  writefds–  asetoffiledescriptorsyouwanttowriteon

•  excepsds–  don’tworryaboutthis

•  6meout–  max.6metowaitbeforereturning–  settoNULLtoblockindefinitely

•  thisisprobablywhatyouwanttodo

Page 45: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ReturnValue

•  Thenumberoffiledescriptorsready,or‐1onerror

Page 46: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

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

Page 47: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

SohowdoIuseselect()?

Page 48: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

Tips

•  Addyouraccept()‐ingfdtothefd_setyouselect() on –  thatwayyoudon’thavetoblockonaccept()

Page 49: Network Programming Minicoursecs.brown.edu/courses/csci1680/f19/content/sockets_mini.pdf · Network Programming ... • Look at Beej’s Network Programming guide for ...

ByteOrder

•  ntohs(), ntohl(), htons(), htonl() •  “networktohostshort”,“networktohostlong”,“hostto

networkshort”,“hosttonetworklong”

•  Makessurethatallinfoissentoverthewireinthesamebyteorder

•  Callhton()beforesendingdataoverthewire•  Callntoh()aaerreadingdataoffofthewire