• socket 2.草稿。


    字序转换。
    htonl
    htons
    ntohl
    ntohs

    struck sockaddr
    {
    sa_family_t sa_family;
    char sa_data[];
    }

    struck in_addr
    {
    in_addr_t s_addr;
    }

    struck sockaddr_in
    {
    sa_family_t sa_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
    }

    二进制和点分转换。
    inet_ntop inet_pton
    #include <arpa/inet.h>
    const char *inet_ntop(int domain, const void *restrict addr,char *restrict str, socklen_t size);
    Returns: pointer to address string on success, NULL on error

    int inet_pton(int domain, const char *restrict str,void *restrict addr);
    Returns: 1 on success, 0 if the format is invalid, or −1 on error

    地址查询。
    struct hostent {
    char *h_name; /* name of host */
    char **h_aliases; /* pointer to alternate host name array */
    int h_addrtype; /* address type */
    int h_length; /* length in bytes of address */
    char **h_addr_list; /* pointer to array of network addresses */
    .
    .
    .
    };


    #include <netdb.h>
    struct hostent *gethostent(void);
    Returns: pointer if OK, NULL on error
    void sethostent(int stayopen);
    void endhostent(void);


    早期函数:gethostbyname and gethostbyaddr


    struct netent {
    char *n_name; /* network name */
    char **n_aliases; /* alternate network name array pointer */
    int n_addrtype; /* address type */
    uint32_t n_net; /* network number */
    .
    .
    .
    };

    struct netent *getnetbyaddr(uint32_t net, int type);
    struct netent *getnetbyname(const char *name);
    struct netent *getnetent(void);
    All return: pointer if OK, NULL on error
    void setnetent(int stayopen);
    void endnetent(void);


    服务和名字之间的转换。
    struct protoent {
    char *p_name; /* protocol name */
    char **p_aliases; /* pointer to alternate protocol name array */
    int p_proto; /* protocol number */
    .
    .
    .
    };

    #include <netdb.h>
    struct protoent *getprotobyname(const char *name);
    struct protoent *getprotobynumber(int proto);
    struct protoent *getprotoent(void);
    All return: pointer if OK, NULL on error
    void setprotoent(int stayopen);
    void endprotoent(void);


    查询服务。
    struct servent {
    char *s_name; /* service name */
    char **s_aliases; /* pointer to alternate service name array */
    int s_port; /* port number */
    char *s_proto; /* name of protocol */
    .
    .
    .
    };


    #include <netdb.h>
    struct servent *getservbyname(const char *name, const char *proto);
    struct servent *getservbyport(int port, const char *proto);
    struct servent *getservent(void);
    All return: pointer if OK, NULL on error
    void setservent(int stayopen);
    void endservent(void);


    //根据服务和主机名,返回一个节点数据结构是assrinfo的链表。
    #include <sys/socket.h>
    #include <netdb.h>

    struct addrinfo {
    int ai_flags; /* customize behavior */
    int ai_family; /* address family */
    int ai_socktype; /* socket type */
    int ai_protocol; /* protocol */
    socklen_t ai_addrlen; /* length in bytes of address */
    struct sockaddr *ai_addr; /* address */
    char *ai_canonname; /* canonical name of host */
    struct addrinfo *ai_next; /* next in list */
    .
    .
    .
    };

    int getaddrinfo(const char *restrict host,
    const char *restrict service,
    const struct addrinfo *restrict hint,
    struct addrinfo **restrict res);
    Returns: 0 if OK, nonzero error code on error
    void freeaddrinfo(struct addrinfo *ai);

    //将地址转换为主机名和服务名
    #include <sys/socket.h>
    #include <netdb.h>
    int getnameinfo(const struct sockaddr *restrict addr, socklen_t alen,
    char *restrict host, socklen_t hostlen,
    char *restrict service, socklen_t servlen, int flags);
    Returns: 0 if OK, nonzero on error


    //通过socket得到address。
    #include <sys/socket.h>
    int getsockname(int sockfd, struct sockaddr *restrict addr,
    socklen_t *restrict alenp);
    Returns: 0 if OK, −1 on error

    //如果已经连接。还可以通过socket得到对端address。

    #include <sys/socket.h>
    int getpeername(int sockfd, struct sockaddr *restrict addr,
    socklen_t *restrict alenp);
    Returns: 0 if OK, −1 on error


    //连接。
    #include <sys/socket.h>
    int connect(int sockfd, const struct sockaddr *addr, socklen_t len);
    Returns: 0 if OK, −1 on error


    //监听。
    //#include <sys/socket.h>
    int listen(int sockfd, int backlog);
    Returns: 0 if OK, −1 on error


    //接受。
    #include <sys/socket.h>
    int accept(int sockfd, struct sockaddr *restrict addr,
    socklen_t *restrict len);
    Returns: file (socket) descriptor if OK, −1 on error

    //数据传输。
    #include <sys/socket.h>
    ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);
    Returns: number of bytes sent if OK, −1 on error


    //数据传输。非可靠连接
    #include <sys/socket.h>
    ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags,
    const struct sockaddr *destaddr, socklen_t destlen);
    Returns: number of bytes sent if OK, −1 on error

    //更多选择。
    #include <sys/socket.h>
    ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
    Returns: number of bytes sent if OK, −1 on error

    //接受数据。
    #include <sys/socket.h>
    ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);
    Returns: length of message in bytes,
    0 if no messages are available and peer has done an orderly shutdown,

    //更多选项。
    #include <sys/socket.h>
    ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags,
    struct sockaddr *restrict addr,
    socklen_t *restrict addrlen);
    Returns: length of message in bytes,
    0 if no messages are available and peer has done an orderly shutdown,
    or −1 on error
    or −1 on error

    //
    #include <sys/socket.h>
    ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
    Returns: length of message in bytes,
    0 if no messages are available and peer has done an orderly shutdown,

    //socket option

    #include <sys/socket.h>
    int setsockopt(int sockfd, int level, int option, const void *val,
    socklen_t len);
    Returns: 0 if OK, −1 on error

    //带外数据。

    #include <sys/socket.h>
    int sockatmark(int sockfd);
    Returns: 1 if at mark, 0 if not at mark, −1 on error

    //非阻塞和异步。

  • 相关阅读:
    解决端口被占用
    Oracle查询所有表的字段明细
    Spring cron表达式
    Java爬取12306余票
    Activiti工作流框架——快速上手
    ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)【奇葩的bug】
    一分钟学会JavaMail(假)__手动滑稽
    通过Servlet实现汉字验证码
    使用ServletContext对象读取资源文件
    编写一个简单的java服务器程序
  • 原文地址:https://www.cnblogs.com/lsfv/p/6350331.html
Copyright © 2020-2023  润新知