2016年6月9日 星期四

十五 Socket

1. TCP Server & Client (單一server&client)


  • client步驟: 產生socket, 指定ip&port&family ,connect, read or write



  • server 步驟: 產生socket,  指定ip&port&family, bind (綁定上一步驟的指定), listen(等客戶),accept(得到客戶fd) , read or write


p.s. family 主要決定domain有af_unix(同台機器上使用) , AF_INET (AF_INET对于IPV4协议的TCP和UDP)

2.socket 函數


socket(int domain, int type, int protocol);

domain 與傳輸領域,範圍有關;與protocol family有關. 
例如AF_UNIX 無網路的一台電腦底下使用,AF_INET 為IPV4的傳輸,AF_INET6為IPV6

type 一個socket domain有許多通訊方法.每個方法屬性不同.
例如:stream & datagrams
stream提供連續,可靠,雙向的資料傳輸
datagram 不會維持連結,傳送方式為非連續,不可靠的

protocol 通常protocol 由domain&type決定,所以預設為0


3.其他函數解釋

  • sockaddr_in 存放指定ip&port&family (AF_INET情況,AF_UNIX存在sockaddr_un)
  • int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
sockaddr* addr填的是server的sockaddr_in
socklen_t addrlen 是它的長度

  • bind
相似同上

  • int listen(int sockfd, int backlog);
server fd , 最大連線數

  • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
有client端請求連結時, acceptc會動作,fd為server fd, 並把client參數放到addr,addrlen為client預設長度
accept回傳client fd

  • linux command: netstat 可看到占用port
3+1. multi server & client
int select(int nfds, fd_set *readfds, fd_set *writefds,
                  fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set); //移除fd從監控set
int  FD_ISSET(int fd, fd_set *set); //目前fd是否在 set 內
void FD_SET(int fd, fd_set *set); //那些fd放入監控set
void FD_ZERO(fd_set *set);

fd_set 儲存fd集合