socket编程基础
网络IP操作函数
字符串的IP和32位的IP转换
#include <sys/socket.h>
#inlcude <netinet/in.h>
#include <arpa/inet.h>
- int inet_aton(const char *cp, struct in_addr *inp);
- in_addr_t inet_addr(const char *cp);
- in_addr_t inet_network(const char *cp);
- char *inet_ntoa(struct in_addr in);
- struct in_addr inet_makeaddr(int net, int host);
- in_addr_t inet_lnaof(struct in_addr in);
- in_addr_t inet_netof(struct in_addr in);
- int inet_pton(int af, const char *src, void *dst);
af:AF_INET, AF_INET6
src:string IP, example:"192.168.103.116"
dst:a network address
return:成功1,src非法返回0,af非法地址返回-1,同时置errno为EAFNOSUPPORT。
#define servip "192.168.1.103"
inet_pton(AF_INET, servip, &servaddr.sin_addr.s_addr);
推荐使用inet_pton()或inet_aton(),而非inet_addr()或inet_network(),因为返回值-1代表IP地址255.255.255.255。
注:网络格式IP为二进制大端格式。
字节转换函数
- unsigned long int htonl(unsigned long int hostlong);
- unsigned short int htons(unsigned short int hostshort);
- unsigned long int ntohl(unsigned long int netlong);
- unsigned short int ntohs(unsigned short int netshort);
注:h代表host,n代表network,s代表short,l代表long
IP和域名的转换
- struct hostent gethostbyname(const char hostname);
- struct hostent gethostbyaddr(const char addr, int len, int type);
#define <netdb.h>
struct hostent {
char *h_name; //主机的正式名称
char *h_aliases; //主机别名
int h_addrtype; //主机的地址类型AF_INET
int h_length; //主机的地址长度,IP4是4字节32位
char **h_addr_list; //主机IP地址列表
}
#define h_addr h_addr_list[0]
这两个函数失败返回NULL,且设置h_errno错误变量,h_strerror()可以得到详细的出错信息。
服务信息函数
在网络程序里面我们有时候需要知道端口,IP和服务信息。
- int getsockname(int sockfd, struct sockaddr *localaddr, int *addrlen);
- int getpeername(int sockfd, struct sockaddr *peeraddr, int *addrlen);
- struct servent *getservbyname(const char *servname, const char *protoname);
- struct servent *getservbyport(int port, const char protoname);
struct servent {
char *s_name; //正式服务名
char **s_aliases; //别名列表
int s_port; //端口号
char *s_proto; //使用的协议
}