Socket Programming Socket Programming l TCPIP l TCPIP

  • Slides: 24
Download presentation
Socket Programming

Socket Programming

Socket Programming l. TCP/IP 簡介 l. TCP/IP模組架構 l. Socket介紹 l. Socket分類 l. Client/Server model(主從式架構模型)

Socket Programming l. TCP/IP 簡介 l. TCP/IP模組架構 l. Socket介紹 l. Socket分類 l. Client/Server model(主從式架構模型) l相關函式 l. TCP Socket程式設計 l. UDP Socket程式設計 l. Socket Read/Write Inside Out l. Performance Matters: Interrupt and Memory Copy at Socket l. Open Source Implementation: Linux Socket Filter

相關函式socket() NAME socket() - create an endpoint for communication SYNOPSIS #include <sys/types. h> #include

相關函式socket() NAME socket() - create an endpoint for communication SYNOPSIS #include <sys/types. h> #include <sys/socket. h> int socket(int domain, int type, int protocol); 1. 由server和client使用 2. domain: 設AF_INET 3. type: SOCK_STREAM或SOCK_DGRAM 4. protocol: 0 (讓socket()根據type自動設定)。 5. 成功傳回socket descriptor,失敗傳回-1 (並使用errno的macro)

相關函式bind() NAME bind() - bind a name to a socket SYNOPSIS #include <sys/types. h>

相關函式bind() NAME bind() - bind a name to a socket SYNOPSIS #include <sys/types. h> #include <sys/socket. h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 1. 由server使用 2. sockfd為socket()的回傳值。 3. myaddr 須指定port和ip後傳入,注意是用struct sockaddr_in宣告 ,傳入時轉為struct sockaddr。 4. addrlen直接用 sizeof(struct sockaddr) 5. bind就是將local的endpoint attach到一個socket

相關函式connect() NAME connect() - initiate a connection on a socket. SYNOPSIS #include <sys/types. h>

相關函式connect() NAME connect() - initiate a connection on a socket. SYNOPSIS #include <sys/types. h> #include <sys/socket. h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 1. connect()由client呼叫 2. sockfd由socket()產生,serv_addr指定server的ip和port後傳入 3. addrlen直接用 sizeof(struct sockaddr)

相關函式listen() NAME listen() - listen for connections on a socket SYNOPSIS #include <sys/socket. h>

相關函式listen() NAME listen() - listen for connections on a socket SYNOPSIS #include <sys/socket. h> int listen(int sockfd, int backlog); 1. 由server使用 2. sockfd由socket()產生,backlog設定可queue住的connection數量 (等待accept())。 3. 失敗傳回-1

相關函式accept() NAME accept() - accept a connection on a socket SYNOPSIS #include <sys/types. h>

相關函式accept() NAME accept() - accept a connection on a socket SYNOPSIS #include <sys/types. h> #include <sys/socket. h> int accept(int sockfd, struct sockaddr *addr, int *addrlen); 1. sockfd: listen()所使用的那個sockfd 2. addr 宣告完就拿來用,將存放client的資訊 3. addrlen直接用 sizeof(struct sockaddr) 4. 失敗傳回-1 5. server listen()完後開始等待accept()。 accept()傳回一個file descriptor以供此connection的I/O之用。 accpet完之後,server繼續使用listen()的fd等待下一個connection。

相關函式sendto() int sendto(int sockfd, const void *msg , int len, int flags); 1. sockfd可以是listen()的fd或是accpet的fd。

相關函式sendto() int sendto(int sockfd, const void *msg , int len, int flags); 1. sockfd可以是listen()的fd或是accpet的fd。 2. msg就是data,len就是data 的length (sizeof(msg)) ,flag就設 0。 3. 回傳值為送出去的大小 4. 失敗傳回-1

相關函式recvfrom() 1. The recvfrom() call is similar in many respects: int recvfrom(int sockfd, void

相關函式recvfrom() 1. The recvfrom() call is similar in many respects: int recvfrom(int sockfd, void *buf , int len, unsigned int flags); 1. sockfd: 要從哪個fd接收。 2. 回傳值為收到的大小。若回傳 0,表示對方把connection切了。

相關函式write() NAME write() - write to a file descriptor SYNOPSIS #include <unistd. h> ssize_t

相關函式write() NAME write() - write to a file descriptor SYNOPSIS #include <unistd. h> ssize_t write(int fd, const void *buf, size_t count); 1. 可寫到file,device或socket

相關函式read() NAME read() - read from a file descriptor SYNOPSIS #include <unistd. h> ssize_t

相關函式read() NAME read() - read from a file descriptor SYNOPSIS #include <unistd. h> ssize_t read(int fd, void *buf, size_t count); 1. 從file,device或socket讀取 2. 沒有data則read會block 3. count指定要讀的長度,如果沒有那麼多,則return,不會block

相關函式close() NAME read() - read from a file descriptor SYNOPSIS #include <unistd. h> int

相關函式close() NAME read() - read from a file descriptor SYNOPSIS #include <unistd. h> int clode(int sockfd); 1. 呼叫close() 若成功:傳回 0 失敗:傳回-1

TCP Socket程式設計

TCP Socket程式設計

UDP Socket程式設計

UDP Socket程式設計

Socket Read/Write Inside out User Space Server socket creation socket() bind() listen() send data

Socket Read/Write Inside out User Space Server socket creation socket() bind() listen() send data accept() sys_socketcall sys_socket sys_bind sys_listen sock_create inet_bind inet_listen inet_create write() sys_write sys_accept do_sock_wri te inet_accept sock_ sendmsg tcp_accept wait_for_ connection inet_ sendmsg tcp_ write_xmit Kernel Space Internet Client socket creation socket() connect() sys_socketcall send data read() sys_read sys_socket sys_connect do_sock_read sock_create inet_stream _connect sock_ recvmsg tcp_v 4_ getport sock_commo n_ recvmsg inet_create tcp_v 4_ connect inet_wait _connect tcp_ recvmsg memcpy_ toiovec

Socket Read/Write Inside out

Socket Read/Write Inside out

Performance Matters: Interrupt and Memory Copy at Socket Latency in receiving TCP segments in

Performance Matters: Interrupt and Memory Copy at Socket Latency in receiving TCP segments in the TCP layer Latency in transmitting TCP segments in the TCP layer

Open Source Implementation: Linux Socket Filter (net/core/filter. c) ◦ Similar to BPF (Berkley Packet

Open Source Implementation: Linux Socket Filter (net/core/filter. c) ◦ Similar to BPF (Berkley Packet FIilter) network monitor rarpd buffer filter user kernel protocol stack BPF link-level driver kernel network