为啥 getservbyname 不返回正确的端口号?

Posted

技术标签:

【中文标题】为啥 getservbyname 不返回正确的端口号?【英文标题】:why doesn't getservbyname return the correct port number?为什么 getservbyname 不返回正确的端口号? 【发布时间】:2014-09-20 02:17:16 【问题描述】:

在我的 C:\Windows\System32\drivers\etc\service 文件中,我看到了

回声 7/tcp 回声 7/udp

所以我写了一个程序来测试getservbyname

#include <stdio.h>
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")  // winsock library

using namespace std;

int main(int argc, char *argv[]) 

WSADATA wsa;
SOCKET s;
sockaddr_in server;
servent     *serverInfo;


cout << "Initializing Winsock...." << endl;

if (WSAStartup(MAKEWORD(2,2), &wsa) != 0) 
    cout << "Failed. Error code: " << WSAGetLastError();
    return 1;

cout << "initialized." << endl; 

serverInfo = getservbyname("echo", "tcp");
cout << "service echo:: s_name is " << serverInfo->s_name << endl; 
cout << "service echo:: s_aliases is " << serverInfo->s_aliases << endl; 
cout << "service echo:: s_port is " << serverInfo->s_port << endl; 
cout << "service echo:: s_proto is " << serverInfo->s_proto << endl; 

return 0;

当我运行它时,显示的结果如下:

Initializing Winsock....
initialized.
service echo:: s_name is echo
service echo:: s_aliases is 00724F08
service echo:: s_port is 1792
service echo:: s_proto is tcp

我的问题是为什么 s_port 是 1792 而不是 7?我在文件服务中找不到 1792。 有人可以解释一下吗?非常感谢。

【问题讨论】:

供您阅读:en.wikipedia.org/wiki/Endianness 【参考方案1】:

7*256=1792

它按网络字节顺序排列。尝试打印 ntohs(serverInfo->s_port)。

如果您要使用它来构建sockaddr_in,您可以直接将其复制到sin_port,因为这也是网络字节顺序。

【讨论】:

以上是关于为啥 getservbyname 不返回正确的端口号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 longLongValue 返回不正确的值

为啥 sin() 不返回正确的值?

isAbstract() 修饰符返回不正确的结果 - 为啥?

为啥以下代码从 NSData 返回不正确的值?

sh ?getservbyname的shell脚本版本(3)

为啥 Frame.Width 和 Frame.Height 返回非常不正确的值