Socket Programming

Click here to load reader

  • date post

    22-Jan-2016
  • Category

    Documents

  • view

    34
  • download

    0

Embed Size (px)

description

Socket Programming. Berkeley Sockets & WinSock 2. http://www.ecst.csuchico.edu/~beej/guide/net/. Introductie. Wat is een socket ? Een manier om 2 processen met elkaar te laten communiceren Unix & linux : Berkeley sockets Windows : Winsock (1 en 2) 2 Types Stream sockets - PowerPoint PPT Presentation

Transcript of Socket Programming

  • Socket ProgrammingBerkeley Sockets&WinSock 2http://www.ecst.csuchico.edu/~beej/guide/net/

  • IntroductieWat is een socket ?Een manier om 2 processen met elkaar te laten communicerenUnix & linux : Berkeley socketsWindows : Winsock (1 en 2)2 TypesStream socketsDatagram sockets

  • Datagram SocketsUnreliable, geen garanties over :Aankomst van dataVolgorde van ontvangstTijdstip van ontvangstOp basis van UDPConnection-lessData wordt in afzonderlijke delen verstuurd (datagrammen)

  • Stream SocketsReliable, garanties over :Aankomst van pakkettenVolgorde van ontvangstOp basis van TCP protocolConnection-orientedData wordt als 1 stream verstuurd (buffering)

  • Byte Ordering2 types :Network Byte Ordering MSB staat vooraan in data typeHost Byte OrderingKan zelfde zijn als NBO of omgekeerdConversie is mogelijk ahv functies zoals htons(),

  • IncludesLinux :#include #include Optioneel :#include #include Win32 :#include winsock2.h

  • Winsock startenWSAStartup

    WORD wVersionRequested;WSADATA wsaData;int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) { /* Tell the user that we could not find a usable */ /* WinSock DLL. */ return;}WSACleanup

  • Error CheckingCheck altijd de return waarde van een socket functie

    Linux : errno wordt ingevuld (global var) perror(char *); schrijft de error uitWIN32 :WSAGetLastError() geeft error int terug

  • Address FamiliesVerschillende types communicatiekanalen & onderliggende protocollenAF_INETInternet protocol socketsAF_UNIXUnix File DescriptorsAF_IRDAInfrared communication

  • Adres StructsAlgemene geval : struct sockaddrSpecifiek geval (AF_INET): struct sockaddr_insin_port en sin_addr 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 */ } struct in_addr { unsigned long s_addr; /* that's a 32-bit long, or 4 bytes */}

  • ConversiefunctiesIp adres in long :unsigned long inet_addr(char *);int inet_aton(const char *cp, struct in_addr *inp);Long naar IP adres :Char * inet_ntoa(struct in_addr);Host Network byte orderhtons() -- "Host to Network Short"htonl() -- "Host to Network Long"ntohs() -- "Network to Host Short"ntohl() -- "Network to Host Long"

  • Voorbeeld (adres)struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(MYPORT); // short, network byte order inet_aton(172.18.254.254", &(my_addr.sin_addr)); memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct struct sockaddr_in my_addr; my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(MYPORT); // short, network byte order my_addr.sin_addr.s_addr=inet_addr(172.18.254.254);memset(&(my_addr.sin_zero), '\0', 8); // zero the rest of the struct

  • Socket()SOCKET socket( int af, int type, int protocol ); int socket(int domain, int type, int protocol); domain, af = AF_INETType : SOCK_STREAM SOCK_DGRAMProtocol = 0Geeft socket identifier terug

  • Bind()int bind(int sockfd, struct sockaddr *my_addr, int addrlen); int bind( SOCKET s, const struct sockaddr* name, int namelen ); Verbindt een socket met een adresVoor connection-oriented socketsVooral van toepassing voor server applicatiesGebruikt bij vaste poort, bv ftp server = 21Anders impliciete call (systeem bindt aan beschikbare poort op lokaal systeem)

  • Connect()int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); int connect( SOCKET s, const struct sockaddr* name, int namelen );Remote adres en poort invullen in sockaddrGebruikt voor connection-oriented socketsRemote socket moet in listening state zijnKan ook gebruikt worden voor datagram sockets (adres wordt intern bijgehouden)

  • Listen() en Accept()int listen(int sockfd, int backlog); Zet de socket in listening modeBacklog = queue lengthint accept(int sockfd, void *addr, int *addrlen);Sockfd = listening socketAddr = info over connecterend systeemreturn value = nieuwe socket !

  • Send()int send(int sockfd, const void *msg, int len, int flags);Stuurt data over een geconnecteerde socketReturn value = effectief aantal verstuurde bytesIs niet altijd gelijk aan len !Indien return value < len : send call herhalen met resterende data

  • Recv()int recv(int sockfd, void *buf, int len, unsigned int flags);Return value = aantal ontvangen bytesIndien 0 : Andere zijde heeft connectie verbrokenLen geeft maximale buffer size aanBlocking functieGaat pas verder wanneer data ontvangen is

  • SendTo() en RecvFrom()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); Datagram socketsAdressen moeten steeds meegegeven worden

  • IO controlint ioctlsocket( SOCKET s, long cmd, u_long* argp); // WIN32int ioctl(int fildes, int request, /* arg */ ...); // LINUXCmd = bv. FIONREADGeeft aantal bytes weer dat kan gelezen worden met een recv() call

  • Close() en Shutdown()close(sockfd); int shutdown(int sockfd, int how);Shutdown kan connectie slechts in 1 richting sluiten indien gewenst0 -- Further receives are disallowed1 -- Further sends are disallowed2 -- Further sends and receives are disallowed (like close())

  • DNS Resolvingstruct hostent *gethostbyname(const char *name); struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; };

    #define h_addr h_addr_list[0] returnt 0 indien naam niet gevonden wordt in dns h_addr is eerste adres uit de lijst

  • Select()int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); Macros :FD_ZERO(fd_set *set) -- clears a file descriptor setFD_SET(int fd, fd_set *set) -- adds fd to the setFD_CLR(int fd, fd_set *set) -- removes fd from the setFD_ISSET(int fd, fd_set *set) -- tests to see if fd is in the set

    struct timeval { int tv_sec; // seconds int tv_usec; // microseconds };

  • Extra informatieLinux : MAN pageshttp://www.ecst.csuchico.edu/~beej/guide/net/html/reference.html

    Windowshttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_api_reference_2.asphttp://www.sockets.com/