Presentation is loading. Please wait.

Presentation is loading. Please wait.

Sop, Fan Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming.

Similar presentations


Presentation on theme: "Sop, Fan Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming."— Presentation transcript:

1 Sop, Fan 07302010028@fudan.edu.cn Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming

2 Concurrency 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?

3 Clients User 1 (goes to lunch) Server connect() accept() fgets() User 2 read() connect() Blocked! Blocks!

4 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

5 Fork()  Use Pid to verify different process  Assign different task flow accordingly Signal & waitpid(…)  Tracing child processes, kill the zombies Other process control methods?

6 pthread_create  Create thread according to detailed settings Pthread(series: join, detach, cancel…)  Imply different polices. Other thread control methods?

7 Monitor 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 + 1 readfs – Bit vector of read descriptors to monitor writefds – Bit vector of write descriptors to monitor exceptfds – Read the manpage, set to NULL timeout – How long to wait with no activity before returning, NULL for eternity

8 void FD_ZERO(fd_set *fdset);  Clears all the bits void FD_SET(int fd, fd_set *fdset);  Sets the bit for fd void FD_CLR(int fd, fd_set *fdset);  Clears the bit for fd int FD_ISSET(int fd, fd_set *fdset);  Checks whether fd’s bit is set

9 Requirements  Mass users  User Experience Incidents  Server/Network/Client breakdown?  Hacking?  …

10 Server Client(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 … …

11 Socket API offers variable settings to meet different demands. (methods settings) Programming concurrency with different detailed settings. Exception/ error cases handling

12 Address re-use Non-blocking int sock, opts; sock = socket(…); // getting the current options setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts)); int sock, opts; sock = socket(…); // getting the current options setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opts, sizeof(opts)); // getting current options if (0 > (opts = fcntl(sock, F_GETFL))) printf(“Error…\n”); // modifying and applying opts = (opts | O_NONBLOCK); if (fcntl(sock, F_SETFL, opts)) printf(“Error…\n”); bind(…); // getting current options if (0 > (opts = fcntl(sock, F_GETFL))) printf(“Error…\n”); // modifying and applying opts = (opts | O_NONBLOCK); if (fcntl(sock, F_SETFL, opts)) printf(“Error…\n”); bind(…);

13 An easy model.

14 struct 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) struct 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)

15 // Setup your read_set with FD_ZERO and the server socket descriptor while (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 // Setup your read_set with FD_ZERO and the server socket descriptor while (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

16 Your suggestions?

17 Architecture

18 A struct something like this: typedef struct s_pool { int maxfd; // largest descriptor in sets fd_set read_set; // all active read descriptors fd_set write_set; // all active write descriptors fd_set ready_set;// descriptors ready for reading int nready;// return of select() int clientfd[FD_SETSIZE];// max index in client array // might want to write this read_buf client_read_buf[FD_SETSIZE]; // what else might be helpful for project 1? } pool; typedef struct s_pool { int maxfd; // largest descriptor in sets fd_set read_set; // all active read descriptors fd_set write_set; // all active write descriptors fd_set ready_set;// descriptors ready for reading int nready;// return of select() int clientfd[FD_SETSIZE];// max index in client array // might want to write this read_buf client_read_buf[FD_SETSIZE]; // what else might be helpful for project 1? } pool;

19 Basic Commands  NICK  USER  QUIT Channel Commands  JOIN  PART  LIST Advanced Commands  PRIVMSG  WHO

20 Server Client(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

21 Strong 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

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

23


Download ppt "Sop, Fan Reference: Daniel Spangenberger Computer Networks PPT-4 Socket Programming."

Similar presentations


Ads by Google