| |
取得本地主机名:
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绑定的端口可以被重用。
注意:在Linux系统中,如果一个socket绑定了某个端口,该socket正常关闭或程序退出后,在一段时间内该端口依然保持被绑定的状态,其他程序(或者重新启动的原程序)无法绑定该端口。可以通过调用以下语句避免该问题:
opt = 1;
len = sizeof(opt);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,&len);
获得或改变socket的I/O属性:
int ioctl(int sockfd,long cmd,unsigned long* argp);
cmd属性类型,argp属性的参数。
常用的有:
FIONREAD,返回socket缓冲区中未读数据的字节数
FIONBIO,argp为零时为阻塞模式,非零时为非阻塞模式
SIOCATMARK ,判断是否有未读的带外数据(仅用于TCP协议),返回true或false
int fcntl(int fd, int cmd, long arg);
F_SETFL,arp为O_NONBLOCK时进入非阻塞模式,为0时进入阻塞模式。
F_GETFL,获得属性。
|