当前位置: 技术问答>linux和unix
一个奇怪的getpeername问题,有谁遇到过?
来源: 互联网 发布时间:2015-10-08
本文导语: 用accept获得一个客户端的socket id,在调用getpeername返回此socket远程的连接信息,可用inet_ntoa(...)打印其地址居然为"0.0.0.0",请教关于此现象怎么解释? 操作系统为solaris 8 | inet_ntoa使用了static空间...
用accept获得一个客户端的socket id,在调用getpeername返回此socket远程的连接信息,可用inet_ntoa(...)打印其地址居然为"0.0.0.0",请教关于此现象怎么解释?
操作系统为solaris 8
操作系统为solaris 8
|
inet_ntoa使用了static空间用来返回转换后的地址,所以如果你再一次调用的话就会产生这样的问题……
|
给个例子:
int GetRemoteAddr(const unsigned long ulSocket,
unsigned long & ulRemoteIp,
unsigned short & ulRemotePort)
{
int iRet ;
sockaddr_in RemoteAddr ;
int addrlen = sizeof(sockaddr_in) ;
iRet = getpeername(ulSocket,(struct sockaddr*)&RemoteAddr,(SOCKLEN*)&addrlen) ;
if(iRet!=0)
{
iRet = GETSOCKETERROR ;
}
else
{
ulRemoteIp = RemoteAddr.sin_addr.s_addr ;
ulRemotePort = RemoteAddr.sin_port ;
iRet = OK ;
}
return iRet ;
}
int GetRemoteAddr(const unsigned long ulSocket,
unsigned long & ulRemoteIp,
unsigned short & ulRemotePort)
{
int iRet ;
sockaddr_in RemoteAddr ;
int addrlen = sizeof(sockaddr_in) ;
iRet = getpeername(ulSocket,(struct sockaddr*)&RemoteAddr,(SOCKLEN*)&addrlen) ;
if(iRet!=0)
{
iRet = GETSOCKETERROR ;
}
else
{
ulRemoteIp = RemoteAddr.sin_addr.s_addr ;
ulRemotePort = RemoteAddr.sin_port ;
iRet = OK ;
}
return iRet ;
}
|
char *inet_ntoa(struct in_addr in);
参数传错没有,编译时有没有警告?
参数传错没有,编译时有没有警告?
|
调用位置是否有问题,应该在accept返回的socke id后在fork子进程中调用,
另外,网络地址到主机地址转换是否有问题啊,
另外,网络地址到主机地址转换是否有问题啊,