UNIX环境高级编程 网络IPC:套接字

相关函数列表

//创建一个套接字
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

//套接字是双向的,采用下面函数来禁止一个套接字的I/O
#include <sys/socket.h>
int shutdown(int sockfd, int how);

//大端和小端,有4个用来在处理器字节序和网络字节序之间实施转换的函数
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostinet32);
uint16_t htons(uint16_t hostint16);
uint32_t ntohl(uint32_t netint32);
uint16_t ntohs(uint16_t netint16);

//地址格式的结构体
struct sockaddr {
    sa_family_t  sa_faily;
    char              sa_data[];
};

//IPv4因特网(AF_INET)中,套接字地址用结构体sockaddr_in表示
struct sockaddr_in {
    sa_family_t  sin_family;
    in_port_t      sin_port;
    struct in_addr   sin_addr;
};

//in_addr结构体
struct in_addr {
    in_addr_t   s_addr;
};




//下面函数用于将二进制地址格式和点分十进制字符表示之间转换
#include <arpa/inet.h>
const char *inet_ntop(int domain, const void *restrict addr,
                   char *restrict str, socklen_t size);
int inet_pton(int domain, const char *restrict str, void *restrict addr);


//通过下面函数可以找到给定计算机系统的主机信息
#include <netdb.h>
struct hostent *gethostent(void);
void sethostent(int stayopen);
void endhostent(void);

//hostent结构体
struct hostent {
    char *h_name;
    char **h_aliases;
    int    h_addrtype;
    int    h_length;
    char **h_addr_list;
};


//能够采用一套相似的接口来获得网络名字和网络编号
#include <netdb.h>
struct netent *getnetbyaddr(uint32_t net, int type);
struct netent *getnetbyname(const char *name);
struct netent *getnetent(void);
void setnetent(int stayopen);
void endnetent(void);

//netent结构体至少包含如下内容
struct netent {
    char  *n_name;
    char  **n_aliases;
    int   n_addrtype;
    uint32_t n_net;
};


//可以用下面函数在协议名字和协议编号之间进行映射
#include <netdb.h>
struct protoent *getprotobyname(const char *name);
struct protoent *getprotobynumber(int proto);
struct protoent *getprotoent(void);
void setprotoent(int stayopen);
void endprotoent(void);

//protoent结构体至少包含如下
struct protoent {
    char  *p_name;
    char  **p_aliases;
    int   p_ptoro;
};


//服务是由地址的端口号部分表示的,可以使用getservbyname将一个服务名映射到一个端口号,下面
//函数将一个端口号映射到一个服务名,并可以扫描查询
#include <netdb.h>
struct servent *getservbyname(const char *name, const char *proto);
struct servent *getservbyport(int port, const char *proto);
struct servent *getservent(void);
void serservent(int stayopen);
void endservent(void);

//servent结构体至少包含如下
struct servent {
    char  *s_name;
    char  **s_aliases;
    int   s_port;
    char  *s_proto;
};



//下面函允许将一个主机名和一个服务名映射到一个地址
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *restrict host, const char *restrict service, const struct 
                addrinfo *restrict buf, struct addrinfo **restrict res);
void freeaddrinfo(struct addrinfo *ai);

//addrinfo结构体至少包含以下成员
struct addrinfo {
    int   ai_flags;
    int   ai_family;
    int   ai_socktype;
    int   ai_protocol;
    socklen_t        ai_addrlen;
    struct sockaddr  *ai_addr;
    char             *ai_canonname;
    struct addrinfo  *ai_next;
};

//下面函数将错误码转成错误消息
#include <netdb.h>
const char *gai_strerror(int error);

//将一个地址转换成一个主机名和一个服务名
#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 flag);




//下面函数用来关联地址和套接字
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t len);

//下面函数用来发现绑定到套接字上的地址
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);

//如果套接字已经和对等方连接,下面函数用来找到对方的地址
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict alenp);


//使用下面函数来建立连接
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t len);

//服务器调用下面函数来宣告它愿意接受连接请求
#include <sys/socket.h>
int listen(int sockfd, int backlog);

//一旦服务器调用listen,所用的套接字就能接收连接请求,下面函数获得连接请求并建立连接
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *restrict addr, socklen_t  *restrict len);




//用来发送数据的函数
#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);

//msghdr结构体至少包含如下
struct msghdr {
    void        *msg_name;
    socklen_t   msg_namelen;
    struct iovec *msg_iov;
    int         msg_iovlen;
    void        *msg_control;
    socklen_t   msg_controllen;
    int         msg_flags;
};
            

//用来接收数据的函数
#include <sys/socket.h>
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);




//套接字选项
#include <sys/socket.h>
int setsockop(int sockfd, int level, int option, const void *val, socklen_t len);
int getsockop(int sockfd, int level, int option, void *restrict val, 
              socklen_t *restrict lenp);


//TCP支持紧急标记(urgent mark),为帮助判断是否已经达到紧急标记,可以使用下面函数
#includ <sys/socket.h>
int sockatmark(int sockfd);





猜你喜欢

转载自xxniao.iteye.com/blog/2123000