socket programming references: redklyde ’ s tutorial set winsock2 for games (gamedev.net)

33
Socket Programming References: redKlyde’s tutorial set Winsock2 for games (gamedev.net)

Upload: angelina-farmer

Post on 26-Dec-2015

219 views

Category:

Documents


0 download

TRANSCRIPT

Socket Programming

References:redKlyde’s tutorial setWinsock2 for games (gamedev.net)

Fall 2010 2

Introduction (javadoc)

TCP provides a reliable, point-to-point communication channel that client-server applications on the Internet use to communicate with each other. To communicate over TCP, a client program and a server program establish a connection to one another. Each program binds a socket to its end of the connection. To communicate, the client and the server each reads from and writes to the socket bound to the connection.

Fall 2010Spring 2005 3

Client/Server

Normally, a server runs on a specific computer and has a socket that is bound to a specific port number. The server just waits, listening to the socket for a client to make a connection request.The client knows the hostname of the machine on which the server is running and the port number to which the server is connected.To make a connection request, the client tries to rendezvous with the server on the server's machine and port.

Fall 2010 4

Client/Server (cont)

If everything goes well, the server accepts the connection. On the client side, if the connection is accepted, a socket is successfully created and the client can use the socket to communicate with the server. The client and server can now communicate by writing to or reading from their sockets.

Fall 2010 5

Socket Definition

A socket is one endpoint of a two-way communication link between two programs running on the network. A socket is bound to a port number so that the TCP layer can identify the application that data is destined to be sent.

Fall 2010 6

Winsock 2.2

There are different ways to program with WinSock. the very basic UNIX/Berkeley type functions, the Microsoft’s Windows specialized version of the basic functions, orthe Object Orientated MFC version.

Fall 2010 7

Learning Objectives

Creating a socket (and VC setup)Making the connectionSending and receiving dataMultiple host connection [Optional multi-thread implementation]

Integrating with game loop

Fall 2010 8

redKlyde (Tutorial #1)

VC setting: add WS2_32.lib to projectWSAData: hold info about our network capabilityWSAStartup (…): start up winsock

mysock = socket (AF_INET, SOCK_STREAM,0);

creates a TCP socket for Internet; fails if too many sockets are created

closesocket (mysock);

Every winsock function will return SOCKET_ERROR if error occurredWSAGetLastError() to get the errorcode [see msdn for details]

WSACleanup(): last call of winsock

Fall 2010 9

Tutorial 1Winsock v2.2

AF_INET: Socket for internet

SOCK_STREAM: TCP socket[SOCK_DGRAM: UDP socket]

Fall 2010 10

redKlyde (Toot #2 – Server)

Host/net byte ordering of numbers (next page)Bind: associate a port to socket to send/receive dataSocket address structure [sockaddr_in]: port no., Internet protocol, …Port no: stay above 2024

Listen (listensock, backlog)Clientsocket = accept (listensock, 0,0)

A blocking call [use debugger to verify]

Backlog: the number of clients you can keep waiting before calling accept()

Fall 2010 11

[Endianness]

Big endianNetwork protocolhton, ntoh Host-network

conversion

Little endianWindows

Fall 2010

hton & ntoh

12

Sizeof (short) = 4 bytesSizeof (long) = 8 bytes

htons (7654) = 58909htonl (7654) = 3860660224

Fall 2010

In fact:If the sending and receiving ends are of the same endianness, there is no need to convert

1D E6 1D E6 7654

However, if not so, only through ntoh/hton can guarantee the correctness of the info…

Fall 2010Spring 2005 14

Bind the socket to port 7654

Fall 2010 15

redKlyde (Toot#2 – client)

Which server to connect to?“host entry” structure: gethostbyname (servername)Socket address [sockaddr_in]: port, host_addr

Connect (sock, sockaddr_in, size)

Fall 2010 16

Tut 2(c)

Or IP “140.129.25.1

94”

Fall 2010 17

redKlyde (Toot#3)

Send/recv fixed length messageMacros for earlier commandsNbytes = recv (clientsock, buffer,buffersize,0)Nbytes = send (clientsock,buffer,size,0);

Fall 2010Spring 2005 18

Tut3 (server)

Fall 2010 19

Tut3 (client)

Fall 2010 20

redKlyde (Toot#4)

How about variable length message?TCP concatenates all packets into one big chunkUse escape character to decipher…Send the size of message first, then recv accordingly

!? Why the size won’t be mixed with the coming messages?!This is the simple protocol we set for this example.

Fall 2010 21

Tut4 (server)

Fall 2010 22

Tut4 (client)

Fall 2010

Tut5: Overview

Thread: a sequence of instructions that may execute in parallel with other threadsMulti-threaded AP Accept thread: accept clients connecting to the

server socket; add client socket to masterset Main thread: polling from selected sets to

process variable-length input

Shared memory: FD_SET (set of client sockets)

23

Fall 2010 24

redKlyde (Toot#5 – server)

Blocking calls: accept, recvNonblocking calls: send, connect, …FD_SET (file descriptor set): a list of sockets

Data member: fd_count, fd_array

Macros for FD_SET: FD_SET (sock, &set) FD_ZERO (&set) FD_CLR (sock,&set) FD_ISSET(sock,&set)

Select: create a list of sockets that already have data to readException handling:

Clean disconnect: the client closes the socket and exits [no error]

dropped connection [an error will occur]

Remove from FD_SET, close the corresponding socket

Fall 2010

Setting Up

25

Mutex: mutual exclusion algorithms used in concurrent programming to avoid the simultaneous use of a common resource

Code-generation: debug multi-threaded

Fall 2010 26

Accepting thread

Fall 2010

Main Thread1

Spring 2005 27

Fall 2010 28

Main Thread2

Error check…

Fall 2010

Error (dropped connection)

29

Fall 2010

Error (clean disconnect)

30

Client called closesocket

Fall 2010 31

Command Summary

WSAStartup; WSACleanupWSAGetLastError(); socket(); closesocket(); bind(); listen(); accept(); gethostbyname(), connect() ntohl(), ntohs(), htonl(), htons() send(), recv() select() FD_SET, FD_ZERO, FD_CLR, FD_ISSET

Networking for Game Programmers

Reference: Glenn Fieldler’s Blog

Fall 2010 32

Topics

TCP vs. UDPSending & Receiving Packets (UDP)UDP (Virtual) ConnectionUDP flow control

Fall 2010 33