C++ - bind() fails
C++ - bind() fails
我正在尝试学习C++网络,并尝试设置一个简单的演示,在端口 5000 上打开 TCP 服务器,然后立即关闭它。这是我的代码:
#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;
}
尝试将套接字绑定到端口 5000 时出现错误。设置 TCP 服务器端口有什么问题?
附言:opt位到底是什么(我正在遵循教程并同时查看sys/socket的文档(?
在你达到bind()
之前,你的代码中有几个错误:
int socketdesc = socket(SOCK_STREAM, AF_INET, 0(;
您有前 2 个参数值向后,调用需要如下所示:
int socketdesc = socket(AF_INET, SOCK_STREAM, 0);
如果(套接字描述 == 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)
...
话虽如此,请尝试以下操作:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main()
{
int port = 5000;
std::cout << "Port: " << port << "n";
int socketdesc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketdesc == -1)
{
std::cout << "Failed to create socket descriptor. " << strerror(errno) << "n";
return 1;
}
int opt = 1;
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0)
{
std::cout << "Failed to set SO_REUSEADDR option. " << strerror(errno) << "n";
return 1;
}
if (setsockopt(socketdesc, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0)
{
std::cout << "Failed to set SO_REUSEPORT option. " << strerror(errno) << "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! " << strerror(errno) << "n";
return 1;
}
std::cout << "Listening with protocol TCP on port" << port << ".n";
if (listen(socketdesc, 3) < 0)
{
std::cout << "Failed to listen on socket! " << strerror(errno) << "n";
return 1;
}
if (shutdown(socketdesc, SHUT_RDWR) < 0)
{
std::cout << "Failed to close socket! " << strerror(errno) << "n";
return 1;
}
close(socketdesc);
std::cout << "TCP test succeeeded.n";
return 0;
}
我会把这个答案留在这里,即使这次不是这样。我认为这仍然是一个真实的案例,在网站上寻找答案的人可能会对此表示赞赏。
(上面代码的真正答案在评论中(
您需要关闭套接字,但您尚未在每个故障状态下都这样做。它将保持打开状态并阻止您再次绑定到它,即使该过程结束也是如此。
如果不是这种情况,则可能有其他程序使用该端口。尝试更改端口号。
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- boost::bind()类似的东西,但用于函数调用
- 使用 std::应用于 std::bind
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind,无法让具有单个参数的方法工作
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- 在模板类成员上使用 std::bind
- C++ - bind() fails