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++;-bind()失败 我试图在C++中学习网络,我正在尝试建立一个简单的演示,在这里我打开一个TCP服务器在端口5000上,然后立即关闭它。这是我的代码: #include <iostream> #include <sys/socket.h> #include <netinet/in.h> int main() { int port = 5000; std::cout << "Port: " << port << "\n"; int socketdesc = socket(SOCK_STREAM, AF_INET, 0); if (socketdesc == 0) { std::cout << "Failed to create socket description.\n"; return 1; } int opt = 1; if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { std::cout << "Failed to attach socket.\n"; return 1; } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(port); if (bind(socketdesc, (struct sockaddr *)&address, sizeof(address)) < 0) { std::cout << "Failed to bind socket!\n"; return 1; } std::cout << "Listening with protocol TCP on port" << port << ".\n"; if (listen(socketdesc, 3) < 0) { std::cout << "Failed to listen!\n"; return 1; } if (shutdown(socketdesc, SHUT_RDWR) < 0) { std::cout << "Failed to close socket!\n"; return 1; } std::cout << "TCP test succeeeded.\n"; return 0; } #包括 #包括 #包括 int main() { int端口=5000; std::cout_C++_Sockets - Fatal编程技术网

C++;-bind()失败 我试图在C++中学习网络,我正在尝试建立一个简单的演示,在这里我打开一个TCP服务器在端口5000上,然后立即关闭它。这是我的代码: #include <iostream> #include <sys/socket.h> #include <netinet/in.h> int main() { int port = 5000; std::cout << "Port: " << port << "\n"; int socketdesc = socket(SOCK_STREAM, AF_INET, 0); if (socketdesc == 0) { std::cout << "Failed to create socket description.\n"; return 1; } int opt = 1; if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { std::cout << "Failed to attach socket.\n"; return 1; } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(port); if (bind(socketdesc, (struct sockaddr *)&address, sizeof(address)) < 0) { std::cout << "Failed to bind socket!\n"; return 1; } std::cout << "Listening with protocol TCP on port" << port << ".\n"; if (listen(socketdesc, 3) < 0) { std::cout << "Failed to listen!\n"; return 1; } if (shutdown(socketdesc, SHUT_RDWR) < 0) { std::cout << "Failed to close socket!\n"; return 1; } std::cout << "TCP test succeeeded.\n"; return 0; } #包括 #包括 #包括 int main() { int端口=5000; std::cout

C++;-bind()失败 我试图在C++中学习网络,我正在尝试建立一个简单的演示,在这里我打开一个TCP服务器在端口5000上,然后立即关闭它。这是我的代码: #include <iostream> #include <sys/socket.h> #include <netinet/in.h> int main() { int port = 5000; std::cout << "Port: " << port << "\n"; int socketdesc = socket(SOCK_STREAM, AF_INET, 0); if (socketdesc == 0) { std::cout << "Failed to create socket description.\n"; return 1; } int opt = 1; if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { std::cout << "Failed to attach socket.\n"; return 1; } struct sockaddr_in address; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(port); if (bind(socketdesc, (struct sockaddr *)&address, sizeof(address)) < 0) { std::cout << "Failed to bind socket!\n"; return 1; } std::cout << "Listening with protocol TCP on port" << port << ".\n"; if (listen(socketdesc, 3) < 0) { std::cout << "Failed to listen!\n"; return 1; } if (shutdown(socketdesc, SHUT_RDWR) < 0) { std::cout << "Failed to close socket!\n"; return 1; } std::cout << "TCP test succeeeded.\n"; return 0; } #包括 #包括 #包括 int main() { int端口=5000; std::cout,c++,sockets,C++,Sockets,我将把这个答案留在这里,即使这次不是这样。我认为这仍然是一个真实的案例,在网站上寻找答案的人可能会感激这一点 (以上代码的真实答案在评论中) 您需要关闭套接字,但并不是在每个故障状态下都这样做。它将保持打开状态并阻止您再次绑定到它,即使进程结束 如果不是这种情况,那么您可能有其他程序使用该端口。请尝试更改端口号。在您到达bind()之前,代码中有几个错误: int socketdesc=socket(SOCK\u流,AF\u INET,0) 前两个参数值向后,调用需要如下所示: int soc

我将把这个答案留在这里,即使这次不是这样。我认为这仍然是一个真实的案例,在网站上寻找答案的人可能会感激这一点

(以上代码的真实答案在评论中)


您需要关闭套接字,但并不是在每个故障状态下都这样做。它将保持打开状态并阻止您再次绑定到它,即使进程结束


如果不是这种情况,那么您可能有其他程序使用该端口。请尝试更改端口号。

在您到达
bind()
之前,代码中有几个错误:

int socketdesc=socket(SOCK\u流,AF\u INET,0)

前两个参数值向后,调用需要如下所示:

int socketdesc = socket(AF_INET, SOCK_STREAM, 0);
if(socketdesc==0)

socket()
出错时返回-1,而不是0

if(setsockopt(socketdesc,SOL_SOCKET,SO|REUSEADDR | SO|REUSEPORT,&opt,sizeof(opt)))

setsockopt()
出错时也返回-1

但更重要的是,您不能像这样在一次调用中组合多个套接字选项。您需要分别为每个选项调用
setsockopt()

if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
...

if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0)
...
if(setsockopt(socketdesc,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt))<0)
...
if(setsockopt(socketdesc,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(opt))<0)
...
话虽如此,请尝试以下方法:

#包括
#包括
#包括
#包括
int main()
{
int端口=5000;

std::cout
bind
失败后
errno
的值是多少?如果某个东西失败,请检查失败的东西的返回值/errno等。对于POSIX库函数,手册页总是非常有用。您可以找到
bind()
的相应错误代码。我不确定,但我认为您可以“字符串化”带有
socket(SOCK\u-STREAM,AF\u-INET,0);
的代码不应该是
socket(AF\u-INET,SOCK\u-STREAM,0);
?因此您调用
bind
时使用了一个错误的描述符值(-1)。@liaqoure en.cppreference.com是详细的、最新的,并且通常是正确的(尽管在web上没有保证)另请注意,根据
-1
返回的是错误,而不是
0
。因此,在开始绑定之前,您可能会先排除错误。您确实需要关闭套接字,但存在“再次打开它”之类的情况,或者由于存在先前的套接字而无法打开套接字。您似乎认为进程只能打开一个套接字。我不是这个意思。一个进程肯定可以同时打开多个套接字。我的观点是,如果不关闭套接字,它在程序的生存期之外仍然有效。如果调试TCP服务器程序并且没有正确管理套接字,这可能会导致问题。我将“打开”更改为“绑定”为了避免这种混淆。因为您可以有多个套接字,但只有一个进程可以绑定到某个端口。我为其编程的所有操作系统都将在打开套接字的进程退出后关闭该套接字。可能会阻止另一个进程在同一端口上重新打开套接字一段时间(以分钟为单位)但最终内核将清理所有内容,并允许再次打开套接字/端口。
opt
是否需要任何特定值,还是始终为1?@liaqoure
所以REUSEADDR
所以REUSEPORT
将布尔整数作为输入,所以它们需要设置为1表示打开,0表示关闭。