C++ 为什么getpeername()返回OK,但结果不是预期的?
问题已经解决了。其根本原因是我把一个C++临时对象作为GETPERNAMEY()的SOCKADDR*传递,在GETPERNAMEY()返回后自动销毁。 因此,最终结果是0 对不起,我粗心大意。我投票决定关闭这个帖子。也请投票结束C++ 为什么getpeername()返回OK,但结果不是预期的?,c++,sockets,networking,tcp,C++,Sockets,Networking,Tcp,问题已经解决了。其根本原因是我把一个C++临时对象作为GETPERNAMEY()的SOCKADDR*传递,在GETPERNAMEY()返回后自动销毁。 因此,最终结果是0 对不起,我粗心大意。我投票决定关闭这个帖子。也请投票结束 #包括 #包括 #包括 使用名称空间std; void服务器() { 服务器中的sockaddr\u\u addr{}; 服务器地址sin家庭=AF网络; 服务器地址sin地址s地址=inet地址(“127.0.0.1”); 服务器地址sin端口=htons(1234
#包括
#包括
#包括
使用名称空间std;
void服务器()
{
服务器中的sockaddr\u\u addr{};
服务器地址sin家庭=AF网络;
服务器地址sin地址s地址=inet地址(“127.0.0.1”);
服务器地址sin端口=htons(1234);
套接字s_侦听=套接字(AF_INET,SOCK_STREAM,0);
绑定(s_侦听,(sockaddr*)和服务器地址,sizeof(服务器地址));
倾听(s_倾听,5);
while(true)
{
自动s_新建=接受(s_侦听,0,0);
客户端{}中的sockaddr{u;
int size=sizeof(客户地址);
auto-ret=getpeername(s_new,(sockaddr*)和客户端地址和大小);
//
//ret为0,这意味着对getpeername的调用正常。
//但是client_addr充满了0,而不是“127.0.0.1:4”。为什么?
//
}
}
int main()
{
std::thread(server.detach();
sockets\u client=SOCKET(AF\u INET,SOCK\u STREAM,0);
客户端{}中的sockaddr{u;
客户地址sin家庭=AFINET;
客户地址sin地址s地址=inet地址(“127.0.0.1”);
客户地址sin端口=htons(4);
绑定(s_client,(sockaddr*)和client_addr,sizeof(client_addr));
服务器中的sockaddr\u\u addr{};
服务器地址sin家庭=AF网络;
服务器地址sin地址s地址=inet地址(“127.0.0.1”);
服务器地址sin端口=htons(1234);
连接(s_客户端(sockaddr*)和服务器(server_addr),sizeof(server_addr));
getchar();
}
代码是用VC++2012编译的。但是,尽管对函数getpeername的调用返回OK,但返回的数据是错误的(全是0),为什么?getpeername()
初始化sockaddr
结构。如果
等于中的,则它以二进制格式保存ip地址和端口
它不携带包含对等方名称/地址和端口的任何ASCII表示的字符缓冲区
此外,
中的sockaddr\u中的值也按网络字节顺序保存
要打印OP源代码段中注释所表示的地址和端口,可以执行以下操作:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
...
int sd = -1; /* init to invalid socket */
... /* get sd a proper value */
sockaddr_in sa = {0}; /* init to all zeros */
socklen_t sl = sizeof(sa);
if (getpeername(sd, (sockaddr *) &sa, &sl))
perror("getpeername() failed");
else
printf("peer is: %s:%hu\n", inetntoa(sa.sinaddr), ntohs(sa.sin_port));
#包括
#包括
#包括
...
int sd=-1;/*初始化到无效套接字*/
... /* 获取一个合适的值*/
sa中的sockaddr_={0};/*初始化为全零*/
socklen_t sl=sizeof(sa);
if(getpeername(sd,(sockaddr*)和sa,以及sl))
perror(“getpeername()失败”);
其他的
printf(“对等方为:%s:%hu\n”、inetnota(sa.sinaddr)、ntohs(sa.sinu端口));
OT:为什么不使用accept()
的第二个和第三个参数来获取对等方?这是高度简化的代码,用于关注关键问题。我真正的目的是只在accept()之后很久通过套接字获取对等信息代码>,空括号对的用途是什么?这甚至可以编译吗?没有=
所以它不是初始化。@在C++11中,它是合法的。如果没有指定,
中的sockaddr\u包含“127.0.0.1:4”,为什么希望它包含“127.0.0:4”?
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
...
int sd = -1; /* init to invalid socket */
... /* get sd a proper value */
sockaddr_in sa = {0}; /* init to all zeros */
socklen_t sl = sizeof(sa);
if (getpeername(sd, (sockaddr *) &sa, &sl))
perror("getpeername() failed");
else
printf("peer is: %s:%hu\n", inetntoa(sa.sinaddr), ntohs(sa.sin_port));