获取/设置参数
主页 上一层 转换函数 网络连接函数 获取/设置参数

 

取得本地主机名:

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,获得属性。