精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
早期的互联网类似现在的局域网,是美国试验性质的产品。在通信协议标准化后,慢慢扩大范围和增加内容。内容一般是放到主机上。这里提到的主机是互联网上提供数据的计算机,而我们个人用的计算机一般是客户端。客户端访问主机,要么是浏览主机上的html网页,要么是连接主机上的数据库,要么是连接主机上的通信服务进行通信。在互联网统一组网环境里,IP地址代表了一个主机,但一个主机可以有多个IP。IP往往是和网卡对应,一台主机上可以安装多个网卡。本章讲了IP地址在编程上的处理细节。
要点
struct sockaddr_un addr;
…
connect(sd,(struct sockaddr*)&addr,sizeof(addr));
#include <sys/socket.h>
#include <sys/un.h>
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX*/
char sun_path[UNIX_PATH_MAX];/*pathname*/
};
(参考man unix)
#include <sys/socket.h>
#include <netinet/in.h>
struct sockaddr_in { sa_family_t sin_family;/*adderss family:AF_INET*/ u_int16_t sin_port;/*port in network byte order*/ struct in_addr sin_addr;/*Internet address*/ }; /*Internet adderss .*/ struct in_addr { int_addr_t s_addr;/*adderss in network byte order*/ };注意:int_addr_t只是一个无符号32位整数(参考man 7 ip)。
struct sockaddr_in addr;
…
struct inaddr x=addr.sin_addr;/*以结构体形式访问*/
in_addr_t y=addr.sin_addr.s_addr;/*以整数形式访问*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
struct in_addr { unsigned long int s_addr; } int inet_aton(const char *cp,struct in_addr*inp); char *inet_ntoa(struct in_addr in); in_addr_t inet_addr(const char *cp);
char cip[16];
strcpy(cip,inet_ntoa());
#include <sys/socket.h>
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr,int len,int type);
struct hostent {
char *h_name;/*主机官方名称*/
char **h_aliases;/*别名列表*/
int h_addrtype;/*主机地址类型*/
int h_length; /*地址长度*/
char **h_addr_list;//地址的列表*/
}
#define h_addr h_addr_list[0] /*为了向后兼容*/
struct hostent *hostentry;
struct in_addr addr;
…
memcpy(&addr,hostentry->h_addr,hostentry->h_length);
printf(“The address is %X\n”,ntohl(addr.s_addr));
extern int h_errno;
void herror(const char *s);
const char *hstrerror(int err);
herror()的工作模式和perror()是一样的。hstrerror()获取和错误相关的描述文本的指针。这些函数认为是要废弃的,但是依然广泛使用。
HOST_NOT_FOUND:指定主机没找到
NO_ADDRESS,NO_DATA:名称无效,但是有IP地址
NO_REOVERY:超出范围外的名称服务错误
TRY_AGAIN:暂时性错误,可随后再试
int gethostname(char*name,size_t len);
int sethostname(const char *name,size_t len);
这些函数在成功时返回0。获取函数的第二个参数获取到名称的最大长度;长名称会被截取掉。设置函数的第二个参数是新名称的实际长度。