- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个服务器-客户端程序,在服务器中我在服务器上使用 getaddrinfo 和 getsockname 来获取有关本地 IP 地址和本地绑定(bind)端口号的信息。使用此信息,我启动我的客户端程序并使用 getaddrinfo,然后打印出 servinfo 数据结构中的返回值: getaddrinfo(argc[1], argc[2], &hints, &servinfo); >> 服务器主机名和服务器端口号通过命令行传递。
但我注意到 servinfo 中的 sin_port 不是我通过命令行传递的端口。1)这个 getaddrinfo 是否返回客户端使用的端口号作为源端口号?2)在 getaddrinfo 和套接字调用失败后我的连接调用。我不知道为什么。我该如何调试它?
我的客户端代码片段:
memset(&hints, 0 ,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME | AI_NUMERICSERV;
getaddrinfo(argc[1], argc[2], &hints, &servinfo);
for (p = servinfo till p!=NULL)
sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)
connect(sockfd, p->ai_addr, p->ai_addrlen) >>>>> Connect not going through.
我这样启动我的客户端程序:./a.out myservername 18844
谢谢!
最佳答案
新答案:您只用一个参数调用您的程序,因此 argv[1]
包含 "18844"
和 argv[2]
是一个空指针。这将尝试连接到具有数字 IP 18844 和未指定端口号(最终为 0 并失败)的主机。
旧答案:(相关但不是你的问题)sin_port
和整个 sockaddr_in
结构是网络字节顺序。您需要使用 ntohl
转换端口以将其用作数字,但最好永远不要接触 sockaddr
结构的内部结构。相反,使用 getnameinfo
和 NI_NUMERICHOST
和 NI_NUMERICSERV
将地址恢复为基于字符串的数字形式,然后 strtol
将端口(“服务”)编号读入整数。这甚至适用于非 IPv4 网络地址/协议(protocol)系列(如 IPv6),并且不需要额外的代码来支持新的。
关于c - getaddrinfo 中返回的 sin_port 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558001/
我创建了下面的Excel VBA代码,该代码使用Winsock API连接到IP地址,从Excel单元格发送文本字符串,然后返回接收文本字符串。 我的代码最初指向带有端口127.0.0.1的IP地址8
我正在学习 C++ 套接字编程。我知道套接字必须绑定(bind)到服务器地址,在客户端,调用 connect() 时有一个内部 bind() 。服务器监听 struct sockaddr_in 的 s
如果我需要获取 IP 的主机名,我应该使用哪个端口? getnameinfo() 从哪里获取主机名? struct sockaddr_in sa; sa.sin_family = AF_INET
我正在编写一个服务器-客户端程序,在服务器中我在服务器上使用 getaddrinfo 和 getsockname 来获取有关本地 IP 地址和本地绑定(bind)端口号的信息。使用此信息,我启动我的客
我尝试在 C 语言的服务器应用程序中打印客户端端口。但是我得到客户端端口的负数,这是什么奇怪的行为:-/任何人都知道哪里可能有问题吗? 导致问题的部分代码: struct sockaddr_in cl
我正在尝试分配函数传递给它的端口号。收到的端口号在收到时正确显示,但是当我尝试将该端口号分配给新的套接字时,该端口号未分配,并且每次都分配了其他一些号码 52428。我尽力自己找出错误,但我失败了:(
我正在尝试制作一个接受连接的非常简单的服务器。 int sock, serv; struct sockaddr_in in_sock; serv = socket(AF_INET, SOCK_STRE
我是一名优秀的程序员,十分优秀!