Network programming csapp

  • IP 地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    struct in_addr{
    unsigned int s_addr
    }
    #include <netinet/in.h>
    unsigned long int htonl(unsigned long int hostlong);
    unsigned short int htons(unsigned short int hostshort);
    本地转网络字节序
    unsigned long int ntohl(unsigned long int hostlong);
    unsigned short int ntohs(unsigned short int hostlong);
    网络转本地字节
    均以无符号数转换
    网络字节摩恩为:大端,即有效地位存放在地址高位
    #include<arpa/inet.h>
    int inet_aton((const char*cp, struct in_addr *inp);
    点分十进制串(cp)转网络字节序IP(inp)
    int inet_ntoa (struct in_addr in);
    网络字节序IP 转点分十进制
  • Domain structure

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <netdb.h>
    struct host{
    char *h_name; // domain name
    char **h_aliases; // Null-terminated array of domain names
    int h_addrtype; // host type (AF_INET)
    int h_length; // length of addr in bytes
    char **h_addr_list; // Null-terminated array of in_addr strcuts
    }
    struct hostent * gethostbyname(const char* name);
    strcut hostent *gethostbtaddr(const char* addr,
    int len(sizeof(addr)),int type(AF_INET))
    success none -null return, else set h_errno
  • Socket structure

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include<netinet/in.h>
    struct sockaddr{
    unsigned short sin_family; // address falily (AF_INET)
    char sa_data[14]; // address data
    };
    struct sockaddr_in{
    unsigned short sin_family;// AF_INET
    unsigned short sin_port; // port number
    unsigned short sin_addr; // IP address
    unsigned char sin_zero[8] // pad
    }
  • Socket function

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <sys/typs.h>
    #include <sys/socket.h>
    int socket(inr domain, SOCK_TREAM, int protoctol);
    成功非负,失败-1
    常规调用 : clinetfd = socket(AF_INET,SOCK_STREAM,0);
    int connect(int sockfd, struct sockaddr * server_addr, int addrlen);
    成功0,失败-1
    connect函数与套接字地址为serv_addr服务器连接,阻塞直到连接成功
    int bind(int sockfd, struct *my_addr, int len);
    success 0,eles -1
    将my_addr服务器套接字地址与套接字描述符sockfd绑定,addrlen = sizeof(sockaddr_in);
    int listen(int sockfd, int backlog);
    成功0,失败-1
    将sockfd从主动套接字转为监听套接字,backlog 设置拒绝连接前的等待队列请求数量
    int accept(int listenfd, struct sockaddr *adr, int * addrlen);
    成功非负,失败-1
    等待到达侦听描述符sockfd的连接请求,将客户端套接字地址写入addr, 并返回已链接符
  • 数据传输
  • send
    1
    2
    3
    4
    5
    #include <sys/socket.h>
    ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
    ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);
    ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
    Returns: number of bytes sent if OK, −1 on error

sendto 可在无连接端口上指定目标地址

  • receive
    1
    2
    3
    ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
    ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);
    ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);