- 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集合
沒有留言:
張貼留言