Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么getpeername()返回OK,但结果不是预期的?_C++_Sockets_Networking_Tcp - Fatal编程技术网

C++ 为什么getpeername()返回OK,但结果不是预期的?

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

问题已经解决了。其根本原因是我把一个C++临时对象作为GETPERNAMEY()的SOCKADDR*传递,在GETPERNAMEY()返回后自动销毁。 因此,最终结果是0

对不起,我粗心大意。我投票决定关闭这个帖子。也请投票结束


#包括
#包括
#包括
使用名称空间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));