mis*_*ter 10 c++ sockets ubuntu networking client
我想获取客户端地址,但我不确定如何将sockaddr结构转换为sockaddr_in?
struct sockaddr_in cliAddr, servAddr;
n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *) cliAddr,sizeof(cliAddr));
//i tried this but it does not work
struct sockaddr cliSockAddr = (struct sockaddr *) cliAddr;
char *ip = inet_ntoa(cliSockAddr.sin_addr);
Run Code Online (Sandbox Code Playgroud)
提前致谢!:)
我发现问题让我走到了这一步: 从sockaddr结构中获取IPV4地址
很抱歉为了避免混淆,这是我真正的实现,其中"ci"是存储指针(如sockaddr_in)的对象.
/* receive message */
n = recvfrom(*(ci->getSd()), msg, MAX_MSG, 0,(struct sockaddr *) ci->getCliAddr(),ci->getCliLen());
char *ip = inet_ntoa(ci->getCliAddr().sin_addr);
Run Code Online (Sandbox Code Playgroud)
我会收到以下错误:
udpserv.cpp:166: error: request for member ‘sin_addr’ in ‘ci->clientInfo::getCliAddr()’, which is of non-class type ‘sockaddr_in*’
Run Code Online (Sandbox Code Playgroud)
bma*_*eny 25
我想指出,如果这实际上是C++,那么惯用的方法是:
sockaddr *sa = ...; // struct not needed in C++
char ip[INET6_ADDRSTRLEN] = {0};
switch (sa->sa_family) {
case AF_INET: {
// use of reinterpret_cast preferred to C style cast
sockaddr_in *sin = reinterpret_cast<sockaddr_in*>(sa);
inet_ntop(AF_INET, &sin->sin_addr, ip, INET6_ADDRSTRLEN);
break;
}
case AF_INET6: {
sockaddr_in6 *sin = reinterpret_cast<sockaddr_in6*>(sa);
// inet_ntoa should be considered deprecated
inet_ntop(AF_INET6, &sin->sin6_addr, ip, INET6_ADDRSTRLEN);
break;
}
default:
abort();
}
Run Code Online (Sandbox Code Playgroud)
此示例代码处理IPv4和IPv6地址,并且还被认为比任何建议的实现都更加C++惯用.
Som*_*ude 16
它实际上非常简单!
struct sockaddr *sa = ...;
if (sa->sa_family == AF_INET)
{
struct sockaddr_in *sin = (struct sockaddr_in *) sa;
ip = inet_ntoa(sin->sin_addr);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21962 次 |
最近记录: |