C++关闭套接字以启动新连接
C++ Closing Socket to initiate new connection
我是C++套接字编程的新手。 我制作了一个简单的端口扫描仪来扫描一个端口,它按预期工作。
现在我正在尝试扫描多个端口,所以我创建了一个套接字并开始迭代一系列端口,但所有端口都显示为关闭。
我的问题是:我必须关闭套接字才能扫描另一个端口吗?
代码如下:
// This Code scan correctly
// ------------------------
for (int i = 0; i < 7; i++)
{
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 260000; //750000 = 0.75s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(ports[i]);
inet_pton(AF_INET, "192.168.100.1", &srv_addr.sin_addr.s_addr);
int connection_result = connect(sock_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(connection_result == 0)
{
std::cout << "Port Openn";
close(sock_fd);
}
else
{
std::cout << "Port closedn";
close(sock_fd);
}
}
但是我在 for 循环外创建/关闭套接字的这段代码将所有端口显示为关闭!
// Shows all ports close
// ----------------------
int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
for (int i = 0; i < 7; i++)
{
//int sock_fd = socket(AF_INET, SOCK_STREAM, 0);
struct timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100000; //750000 = 0.75s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(ports[i]);
inet_pton(AF_INET, "192.168.100.1", &srv_addr.sin_addr.s_addr);
int connection_result = connect(sock_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(connection_result == 0)
{
std::cout << "Port Openn";
//close(sock_fd);
}
else
{
std::cout << "Port closedn";
//close(sock_fd);
}
}
close(sock_fd);
所以显然我必须关闭每个连接之间的插座,感谢 一些程序员伙计
所以我现在更改了我的代码,我在 for 循环中创建/关闭套接字。
示例如下:
for (int i = 0; i < 7; i++)
{
// Creating the socket
// -------------------
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 260000; //260000 = 0.26s
if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set RCV timeoutn";
if(setsockopt(sock_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) < 0)
std::cout << "Cannot set SND timeoutn";
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(ports[i]);
inet_pton(AF_INET, "192.168.100.1", &srv_addr.sin_addr.s_addr);
int connection_result = connect(sock_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
if(connection_result == 0)
{
std::cout << "Port Openn";
// Closing the socket
close(sock_fd);
}
else
{
std::cout << "Port closedn";
// Closing the socket
close(sock_fd);
}
}
相关文章:
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- C++关闭套接字以启动新连接
- Live555MediaServer 在每个新连接时重新启动流。为什么将"reuseSource"设置为 true 无法按预期工作?
- boost::asio 允许非阻塞接受新连接,而连接的处理程序正在阻塞
- 为什么要在不同的连接(新的InternetOpen和New Internet Connect)上对HttpsendReq
- 如何制作新连接监视器主屏幕
- 连接后连接丢失 ->服务器 TCP 提升。亚西奥
- QJSONRPC 中的客户端连接/断开连接事件
- 使用连接方法连接到插槽
- 在 Asio 中建立新连接时出现"Already Open"错误
- Qt 连接无法连接到插槽
- 使用 Qt5 新连接语法与继承
- 无法使用 IOCP 正确接受新连接 - 套接字句柄无效
- 如何快速将整数simmilar连接到连接字符串
- 在不轮询GetMessage()的情况下检测USB连接/断开连接
- Boost::asio::acceptor语言 - 在旧连接仍然打开的情况下接受新连接
- 在 QtConcurrent::run 中使用 QSqlDatabase 连接(伪连接池)
- Boost asio接收器在没有新连接的情况下解锁
- 图形连接和连接组件
- 使用端口音频对已连接/未连接设备的回调