取得本地主机名:
int gethostname(char *hostname, size_t size);
获得主机名存到hostname中。
取得本地的信息:
int getsockname(int sockfd, struct sockaddr *addr, int *addrlen);
addr存有返回的主机信息。
示例:
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(sockfd, (struct sockaddr *)&sa, &len);
printf("本地IP:%s", inet_ntoa(sa.sin_addr));
取得对方主机的信息:
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
addr存有返回的主机信息。
示例:
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername(sockfd, (struct sockaddr *)&sa, &len);
printf("对方IP:%s", inet_ntoa(sa.sin_addr));
获得DNS信息:
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr, int len, int type);
返回了一个指向struct hostent的指针,struct hostent定义如下:
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
};
#define h_addr h_addr_list[0] /* for backward compatibility */
对于如何获得DNS信息,将在后面的程序片断中详细讲解。
DNS操作时的错误处理与普通程序不同,gethostbyname通过设置h_errno代表出错号,对应的错误函数有hstrerror()和herror(),分别对应于strerror()和perror()这两个普通的错误函数。
获得或改变socket属性
int getsockopt(int sockfd, int level, int name, char *value, int *optlen);
int setsockopt(int sockfd, int level, int name, char *value, int *optlen);
对于socket编程,level一般为常数SOL_SOCKET
name属性类型,value属性参数,optlen属性内存块的长度
常用的有:
SO_RCVTIMEO,SO_SNDTIMEO:获得或设置socket发送/接收的timeout。
SO_SNDBUF,SO_RCVBUF:获得或设置socket发送/接收的buffer大小。
SO_BROADCAST:获得或设置socket状况,使之可以广播发送数据报。(只能用于UDP方式)。
SO_REUSEADDR:设置该socket绑定的端口可以被重用。