C语言基础-网络相关函数

bentocaffe 2020-05-09

一、相关函数

函数描述
int socket(int family, int type, int protocol);位于:<sys/socket.h>;
功能:创建一个网络套接字 ;
返回:成功返回一个非负数的描述符,出错返回-1。
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);位于:<sys/socket.h>;
功能:把一个本地协议地址赋予一个套接字;
返回:成功返回0,出错返回-1。
int listen(int sockfd, int backlog);位于:<sys/socket.h>;
功能:;
返回:成功返回0,出错返回-1。
int accept(int sockfd, struct sockaddr *cliaddr, socklne_t *addrlen);位于:<sys/socket.h>;
功能:有服务器调用,用于从已完成连接队列头返回下一个已完成连接;
返回:成功返回0,出错返回-1。
int connect(int sockfd,const struct sockaddr *servaddr, socklen_t addrlen);位于:<sys/socket.h>;
功能:建立与服务器的连接;
返回:成功返回0,出错返回-1。
int clost(int sockfd);位于:<sys/socket.h>;
功能:关闭套接字,终止连接;
返回:成功返回0,出错返回-1。
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *adddrlen);位于:<sys/socket.h>;
功能:返回与某个套接字关联的本地协议地址;
返回:成功返回0,出错返回-1。
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *adddrlen);位于:<sys/socket.h>;
功能:返回某个套接字关联的外地协议地址;
返回:成功返回0,出错返回-1。
int shutdown(int sockfd, int howto);位于:<sys/socket.h>;
功能:关闭套接字;
参数:sockfd为套接字标识;howto可能为: SHUT_RD关闭连接的输入流,SHUT_WR关闭连接的输出流,SHUT_RDWR输入输出都关闭;
返回:成功返回0,出错返回-1。
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);位于:<sys/socket.h>;
功能:获取影响套接字的选项;
返回:成功返回0,出错返回-1。
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);位于:<sys/socket.h>;
功能:设置影响套接字的选项;
返回:成功返回0,出错返回-1。
int fcntl(int fd, int cmd, …);位于:<fcntl.h>;
功能:执行各种描述符控制操作;
返回:成功返回0,出错返回-1。

二、UDP相关函数

函数描述
ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);位于:<sys/socket.h>;
功能:接受套接字发送来的数据;
返回:成功返回读取到的字节数,失败则为-1。
ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);位于:<sys/socket.h>;
功能:发送数据到指定的服务器;
返回:成功返回发送的字节数,失败则为-1。

三、SCTP相关函数

函数描述
int sctp_bindx(int sockfd, const struct sockaddr *addrs, int addrcnt, int flags);位于:<netinet/sctp.h>;
功能:允许SCTP套接字绑定一个特定地址子集;
返回:成功返回0,出错返回-1。
int sctp_connectx(int sockfd, const struct sockaddr *addrs, int addrcnt);位于:<netinet/sctp.h>;
功能:连接到一个多宿对端机;
返回:成功返回0,出错返回-1。
int sctp_getpaddrs(int sockfd, sctp_assoc_t id, struct sockaddr **addrs);位于:<netinet/sctp.h>;
功能:获取对端所有地址;
返回:成功返回0,出错返回错-1。
int sctp_freepaddrs(struct sockaddr *addrs);位于:<netinet/sctp.h>;
功能:释放由sctp_getpaddrs函数分配的资源。
int sctp_getladdrs(int sockfd, sctp_assoc_t id, struct sockaddr **addrs);位于:<netinet/sctp.h>;
功能:获取属于某个关联的本地地址;
返回:成功返回存放在addrs中的本端地址数,出错返回错-1。
void sctp_freeladdrs( struct sockaddr *addrs);位于:<netinet/sctp.h>;
功能:释放由sctp_getladdrs函数分配的地址。
void sctp_sendmsg(int sockfd, const void *msg, size_t msgsz, const struc sockaddr *to, socklen_t tolen, uint32_t ppid, uint flags, uint16_t stream, uint32_t timetolive, uint32_t context);位于:<netinet/sctp.h>;
功能:简化发送方式;
返回:成功返回所有写字节数,出错返回-1。
ssize_t sctp_recvmsg(int sockfd, const void *msg, size_t msgsz, const struc sockaddr *from, socklen_t *fromlen, struct sctp_sndrcvinfo *sinfo, int *msg_flags);位于:<netinet/sctp.h>;
功能:简化获取数据过程;
返回:成功返回所有读字节数,出错返回-1。
int sctp_opt_info(int sockfd, sctp_assoc_t assoc_id, int opt, void *arg, socklen_t *siz);位于:<netinet/sctp.h>;
功能:把参数重新包装到合适的getsockopt调用中的库函数;
返回:成功返回0,出错返回-1。
int sctp_peeloff(int sockfd, sctp_assoc_t id);位于:<netinet/sctp.h>;
功能:从一个一到多式套接字中抽取一个关联,构成单独一个一到一式套接字;
返回:成功返回一个新的套接字描述符,出错返回错-1。

四、IP与地址相关函数

函数描述
struct hostent *gethostbyname(const char *hostname);位于:<netdb.h>;
功能:通过名称获取host;
返回:成功返回一个非空指针,出错返回-1。
struct hostent *gethostbyaddr(const char *addr, socklen_t len, int family);位于:<netdb.h>;
功能:通过IP地址获取主机名;
返回:成功返回非空指针,出错返回-1。
struct servent *getservbyname(const char *servname, const char *protoname);位于:<netdb.h>;
功能:通过给定名字与协议查找服务;
返回:成功返回非空指针,出错返回-1。
struct servent *getservbyport(int port, const char *protoname);位于:<netdb.h>;
功能:根据给定端口号与协议查询服务;
返回:成功返回非空指针,出错返回错1。
struct servent *getaddrinfo(const char *hostname, const *service, const struct addrinfo *hints, struct addrinfo **result);位于:<netdb.h>;
功能:处理名字到地址以及服务到端口这两种转换,返回一个sockaddr结构;
返回:成功返回0,出错返回-1。
const char *gai_strerror(int error);位于:<netdb.h>;
功能:返回一个指向对应的出错信息串的指针。
void freeaddrinfo(struct addrinfo *ai);位于:<netdb.h>;
功能:清除getaddrinfo函数生成的内存空间。
int getnameinfo(struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags);位于:<netdb.h>;
功能:返回描述其中的主机的一个字符串和描述其中的服务的另一个字符串;
返回:成功返回0,出错返回NULL。
struct hostent *gethostbyname_r(const char *hostname, struct hostent *result, char *buf, int buflen, int *h_errnop);位于:<netdb.h>;
功能:;
返回:成功返回非空指针,出错返回NULL。
struct hostent *gethostbyaddr_r(const char *addr, struct int len, int type, struct hostent *result, char *buf, int buflen, int *h_errnop);位于:<netdb.h>;
功能:;
返回:成功返回非空指针,出错返回NULL且设置error_num。
struct hostent *gethostbyname2(const chat *name, int af);位于:<netdb.h>;
功能:;
返回:成功返回非空指针,出错返回错-1。
struct hostent *getipnodebyname(const chat *name, int af, int flags, int *error_num);位于:<netdb.h>;
功能:;
返回:成功返回非空指针,出错返回NULL且设置error_num。

 

五、字节序转换函数

函数作用
主机字节序到网络字节序 
u_long htonl(u_long hostlong);

位于<arpa/inet.h>

htonl ()用来将参数指定的32 位hostlong 转换成网络字符顺序.即大端模式(big-endian)

u_short htons(u_short short);

位于<arpa/inet.h>

htons ()用来将参数指定的16 位short 转换成网络字符顺序.即大端模式(big-endian)

网络字节序到主机字节序 
u_long ntohl(u_long hostlong);

位于<arpa/inet.h>

本函数将一个32位数由网络字节顺序转换为主机字节顺序。

u_short ntohs(u_short short);

位于<arpa/inet.h>

本函数将一个16位数由网络字节顺序转换为主机字节顺序。

六、IP地址的转换

函数作用

int inet_aton(const char *, struct in_addr *);

位于<arpa/inet.h>

功能是将一个字符串IP地址转换为一个32位的网络序列IP地址。如果这个函数成功,函数的返回值非零,如果输入地址不正确则会返回零

in_addr_t inet_addr(const char *);

位于<arpa/inet.h>

inet_addr()的功能是将一个点分十进制的IP转换成一个长整数型数(u_long类型)。

仅适用于ipv4

出错时返回-1

不能用户255.255.255.255的转换

char *inet_ntoa(struct in_addr);

位于<arpa/inet.h>

将一个IP转换成一个互联网标准点分格式的字符串。

int inet_pton(int af, const char *src, void *dst);

位于<arpa/inet.h>

inet_pton是一个IP地址转换函数,可以在将IP地址在点分十进制和“二进制整数”之间转换

而且inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。

af:地址协议族(AF_INET或AF_INET6)

src:是一个指针(填写点分形式的IP地址)

dst:转换的结果给到dst

 

 

 

结构体

2.1 in_addr

/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr; /* 32为 IPV4 地址*/
  };

2.1 sockaddr_in

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;            /* Port number.  */
    struct in_addr sin_addr;        /* Internet address.  */

    /* Pad to size of `struct sockaddr‘.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
               __SOCKADDR_COMMON_SIZE -
               sizeof (in_port_t) -
               sizeof (struct in_addr)];
  };

相关推荐

末点 / 0评论 2020-06-27