为什么 getservbyname 不返回正确的端口号?
why doesn't getservbyname return the correct port number?
在我的C:\Windows\System32\drivers\etc\service文件中,我看到了
echo 7/tcpecho 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。有人能解释一下吗?非常感谢。
7*256=1792
它是按网络字节顺序排列的。请尝试打印ntohs(serverInfo->s_port)。
如果您要使用它来构建sockaddr_in
,您可以直接将它复制到sin_port
,因为这也是网络字节顺序。
相关文章:
- 使用 VID、PID、+SN 查找 USB 端口号
- UDP服务器绑定到错误的端口号
- 为什么在 C# 中将 ushort 端口号从 hton 转换为 ntohs 会给出不同的结果
- 使用 boost::asio 是一种便携式方法来查找可用端口号
- 如何从 iptables 队列中的数据包中提取源端口号和目标端口号
- 为每个连接手动分配端口号
- 如果我只有插座,我能找到端口号吗
- visual解析url并替换C++中的协议和端口号
- 为什么 getservbyname 不返回正确的端口号?
- 一个IP地址和一个端口号可以一起唯一地标识一个进程ID吗
- 使用http_listener无法监听带有本地主机地址的特定端口号(c++ REST SDK)
- 获取网站的端口号
- 端口号、语言、硬件和网络
- 在服务器上使用不同端口号
- 如何找到套接字的本地端口号?(视窗C++)
- 需要一个散列函数来创建ipv6 16字节地址和TCP 2字节端口号的32位值
- 将端口号绑定到TCP套接字(outgoin)以发送数据包