【发布时间】:2020-08-05 06:28:14
【问题描述】:
我检查了我的代码,但我不知道为什么程序无法绑定套接字。 我尝试了许多 ip 和端口(甚至是 127.0.0.1),但它仍然无法正常工作...... 这是我正在使用的代码:
//error message
void error (const char *msg)
{
perror(msg);
exit(1);
}
int main ()
{
int sock, cli_sock, portno;
char buffer[1024];
char response[18432];
struct sockaddr_in serv_addr, cli_addr;
socklen_t cli_len;
//creating socket
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
error("Error opening socket");
bzero ((char *) &serv_addr, sizeof(serv_addr));
//giving port number
portno = 50005;
//giving ip address
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
serv_addr.sin_port = htons(portno);
//bind socket
if(bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) != 0)
error("Binding failed.");
//listen
listen(sock, 5);
cli_len = sizeof(cli_addr);
//accept
cli_sock = accept(sock, (struct sockaddr *) &cli_addr, &cli_len);
if(cli_sock != 0)
error("Error on accepting");
}
(这只是服务器代码的套接字部分,仅供参考,我的客户端版本适用于 Windows,我的服务器版本适用于 Linux)
这是我运行程序时的输出:
Binding failed.: Cannot assign requested address
【问题讨论】:
-
这个错误是关于地址,而不是端口。 127.0.0.1 不可能产生此错误,但您应该使用 INADDR_ANY,除非您有充分的理由不这样做。
-
但
cli_sock != 0仅在cli_sock == -1时表示错误。否则就是成功。 -
真实代码是否也漏掉了
#includes? -
@user207421 是的,我希望这个程序与另一个系统(在我的网络之外)进行通信,所以最后我需要使用一个非本地 IP。但问题是正如你所说,即使使用本地 ip 也会产生此错误!!!
-
@alk 我几乎可以肯定我没有错过任何头文件,因为它编译时没有错误。但运行时不起作用。