gpt4 book ai didi

c++ - 发送到 : Network unreachable

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:18 26 4
gpt4 key购买 nike

我有两台机器正在测试我的代码,一台工作正常,另一台我遇到了一些问题,我不知道为什么会这样。

我正在为项目的网络部分使用一个对象 (C++)。在服务器端,我这样做:(为清楚起见删除了错误检查)

     res = getaddrinfo(NULL, port, &hints, &server)) < 0

for(p=server; p!=NULL; p=p->ai_next){
fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if(fd<0){
continue;
}

if(bind(fd, p->ai_addr, p->ai_addrlen)<0){
close(fd);
continue;
}
break;
}

这一切都有效。然后我用这个构造函数创建一个对象

net::net(int fd, struct sockaddr *other, socklen_t *other_len){
int counter;
this->fd = fd;
if(other != NULL){
this->other.sa_family = other->sa_family;
for(counter=0;counter<13;counter++)
this->other.sa_data[counter]=other->sa_data[counter];
}
else
cerr << "Networking error" << endl;
this->other_len = *other_len;
}

void net::gsend(string s){
if(sendto(this->fd, s.c_str(), s.size()+1, 0, &(this->other), this->other_len)<0){
cerr << "Error Sending, " << s << endl;
cerr << strerror(errno) << endl;
}
return;
}

string net::grecv(){
stringstream ss;
string s;
char buf[BUFSIZE];
buf[BUFSIZE-1] = '\0';

if(recvfrom(this->fd, buf, BUFSIZE-1, 0, &(this->other), &(this->other_len))<0){
cerr << "Error Recieving\n";
cerr << strerror(errno) << endl;
}

// convert to c++ string and if there are multiple trailing ';' remove them
ss << buf;
s=ss.str();
while(s.find(";;", s.size()-2) != string::npos)
s.erase(s.size()-1,1);
return s;
}

所以我的问题是,在一台机器上,一切正常。另一方面,一切正常,直到我调用服务器的 gsend() 函数。我在其中收到“错误:无法访问网络”。我也先调用 gercv(),然后再调用 gsend()。谁能帮我?我真的很感激。

解决方案

事实证明,服务器不喜欢我设置初始 sockaddr 结构的方式。我是这样做的:

     struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_flags = AI_PASSIVE;
hints.ai_protocol = IPPROTO_UDP;

本该是这样的

     struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

谁能解释一下?

最佳答案

需要检查的几件事1. 运行服务器。使用 netstat 并查看服务器绑定(bind)到的 IP 和端口。 IP 是 localhost IP 还是 0.0.0.0 IP?2. 一旦您知道服务器正在正确的端口上监听并且地址正常,请检查您是否可以远程登录到该端口。试试这个 telnet3. 这将尝试连接到端口(不要紧,它不是一个 telnet 服务器,你可以用它来检查连接)4. 如果 telnet 能够连接到端口,即没有错误,您可以检查客户端代码,看看您缺少什么。就像 Glen 提到的那样,您是否检查过您是否能够从客户端计算机建立远程连接?

关于c++ - 发送到 : Network unreachable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2782259/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com