sop, fan [email protected] reference: daniel spangenberger computer networks ppt-4 socket...

23
Socket Programming Part 2 Sop, Fan [email protected] Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming

Upload: alexa-caves

Post on 16-Dec-2015

220 views

Category:

Documents


1 download

TRANSCRIPT

Socket ProgrammingPart 2

Sop, [email protected]

Reference: Daniel SpangenbergerComputer Networks

PPT-4 Socket Programming

TopicsConcurrency Review

Why should we use …? Our experiences?

Socket Programming related System requirement(robustness…) How to cooperate with socket API?

Example How to modify the example to fit further

requirement?

Clients

User 1

(goes to lunch)

Server

A scenario…

connect()

accept()

fgets()

User 2

read()

connect()

Blocked!

Blocks!

How did we add concurrency?

Processes Uses fork() Easy to understand(actually we have implemented

one version!) A lot to consider about causing complexity(zombie,

syscall…)Threads

Natural concurrency (new thread per connection) Easier to understand (you know it already) Complexity is increased (possible race conditions)

Use non-blocking I/O Uses select() Explicit control flow (no race conditions!) Explicit control flow more complicated though

Multi-processFork()

Use Pid to verify different process Assign different task flow accordingly

Signal & waitpid(…) Tracing child processes, kill the zombies

Other process control methods?

Multi-threadpthread_create

Create thread according to detailed settings

Pthread(series: join, detach, cancel…) Imply different polices.

Other thread control methods?

I/O MultiplexingMonitor sockets with select()

int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, const struct timespec *timeout);

So what’s an fd_set? Bit vector with FD_SETSIZE bits

maxfd – Max file descriptor + 1readfs – Bit vector of read descriptors to monitorwritefds – Bit vector of write descriptors to monitorexceptfds – Read the manpage, set to NULLtimeout – How long to wait with no activity before returning, NULL for eternity

So what about bit vectors?void FD_ZERO(fd_set *fdset);

Clears all the bitsvoid FD_SET(int fd, fd_set *fdset);

Sets the bit for fdvoid FD_CLR(int fd, fd_set *fdset);

Clears the bit for fdint FD_ISSET(int fd, fd_set *fdset);

Checks whether fd’s bit is set

Robustness?Requirements

Mass users User Experience

Incidents Server/Network/Client breakdown? Hacking? …

What happened if…?ServerClient(s)

socket()

connect()

write()

read()

close()

socket()

bind()

listen()

select()

write()

read()

close()

read()

Hacking! Hacking!!!

Exceptions here!

Server breakdown!

FD_ISSET(sfd)

accept()

check_clients() main loop

Solutions?Socket API offers variable settings to meet different demands. (methods settings)

Programming concurrency with different detailed settings .

Exception/ error cases handling

Socket setting exampleAddress re-use

Non-blocking

int sock, opts;sock = socket(…);// getting the current optionssetsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts));

// getting current optionsif (0 > (opts = fcntl(sock, F_GETFL)))

printf(“Error…\n”);// modifying and applyingopts = (opts | O_NONBLOCK);if (fcntl(sock, F_SETFL, opts))

printf(“Error…\n”);bind(…);

Server Example

An easy model.

Code – part 1struct sockaddr_in saddr, caddr;int sockfd, clen, isock;unsigned short port = 80;if (0 > (sockfd=socket(AF_INET, SOCK_STREAM, 0)))

printf(“Error creating socket\n”);

memset(&saddr, '\0', sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(port);

if (0 > (bind(sockfd, (struct sockaddr *) &saddr, sizeof(saddr)))

printf(“Error binding\n”);if (listen(sockfd, 5) < 0) { // listen for incoming connections

printf(“Error listening\n”);clen = sizeof(caddr)

Code – part 2// Setup your read_set with FD_ZERO and the server socket descriptorwhile (1) {

pool.ready_set = &pool.read_set;pool.nready = select(pool.maxfd+1, &pool.ready_set,

&pool.write_set, NULL, NULL);if (FD_ISSET(sockfd, &pool.ready_set)) {

if (0 > (isock = accept(sockfd, (struct sockaddr *) &caddr, &clen)))

printf(“Error accepting\n”);add_client(isock, &caddr, &pool);

}check_clients(&pool);

}// close it up down here

Change to an IRC server?

Your suggestions?

Internet Relay Chat Network

Architecture

What was pool?A struct something like this:

typedef struct s_pool {int maxfd; // largest descriptor in setsfd_set read_set; // all active read descriptorsfd_set write_set; // all active write descriptorsfd_set ready_set; // descriptors ready for readingint nready; // return of select()

int clientfd[FD_SETSIZE]; // max index in client array

// might want to write thisread_buf client_read_buf[FD_SETSIZE];

// what else might be helpful for project 1?} pool;

Commands to Implement

Basic Commands NICK USER QUIT

Channel Commands JOIN PART LIST

Advanced Commands PRIVMSG WHO

Back to that lifecycle…ServerClient(s)

socket()

connect()

write()

read()

close()

socket()

bind()

listen()

select()

write()

read()

close()

read()EOF

Connection Request

Client / Server Session(s)

FD_ISSET(sfd)

accept()

check_clients() main loop

SuggestionsStrong I/O skills will be a great assistant.

Read more about this field if interested Books as ‘UNIX Network Programming – The Sockets

Networking API’ will be a good tutorial

Project relatedDeadline: 2011-4-10 Checkpoint: 2011-3-27Detailed information will be put on the FTP:ftp://10.132.141.33/classes/08/102 计算机网络 /PROJECT/project 1

Thanks !Questions?