创建多个侦听套接字
Create multiple listening sockets
我正在使用 winsocks,我正在编写一个 IDS/Honeypot,这只是其中的一小部分,因为目前我希望服务器侦听多个套接字 (7) 并接受连接,但我尝试使用数组(和侦听器等)动态创建套接字,但我仍然遇到问题 - 我已经尝试了多种方式,但到目前为止, 我设法做的只是让它在一个套接字上成功工作,并收听所有套接字,但不接受它们。
所以,这是我的最后一次尝试,但不确定,也许我需要使用线程或以不同的方式声明套接字?
到目前为止,在这个小测试代码中,我想要:
初始化服务器侦听所有 7 个端口 (1111,2222 ...等)接受其中任何一个的传入连接在客户端/服务器上显示两条消息断开连接并继续
我知道这有点草率,但这是到目前为止的代码,我想你可以看到我要去的地方:
#include <iostream>
#include <winsock2.h>
#include <string>
#pragma comment(lib, "ws2_32.lib")
int main()
{
std::cout<<"Honeypot server [test #1] by Dreamwalker"<<std::endl;
WSADATA wsa;
SOCKET s[7] , new_socket[7];
struct sockaddr_in server , client;
int c, port[7] = {1111,2222,3333,4444,5555,6666,7777};
char *message;
std::cout<<"nInitialising Winsock and other components...";
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
std::cout<<"Failed. Error Code :"<<WSAGetLastError()<<std::endl;
return 1;
}
//!IMPORTANT: create multiple new sockets on different ports
int i = 0;
for( i = 0; i < 7; i++)
{
//Create socket
if((s[i] = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
{
std::cout<<"Could not create socket : "<< WSAGetLastError()<<std::endl;
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( port[i] );
//Bind
if( bind(s[i] ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
std::cout<<"Bind failed with error code : "<< WSAGetLastError()<<std::endl;
}
/*!ALL CREATION CHECKING DONE, now create multiple sockets on the server
and listen for connections*/
c = sizeof(struct sockaddr_in);
listen(s[i] , SOMAXCONN);
}
///ALL INITIALIZED
std::cout<<"DONE!"<<std::endl;
//Listen/accept incoming connections
std::cout<<"Now listening for connections"<<std::endl;
new_socket[i] = accept(s[i] , (struct sockaddr *)&client, &c);
if (new_socket[i] == INVALID_SOCKET)
{
std::cout<<"accept failed with error code : "<< WSAGetLastError()<<std::endl;
}
//Accepted connection
else{
std::cout<<"Someone has connected to this machine!"<<std::endl;
message = "Hello Client , I have received your connection.n";
send(new_socket[i] , message , strlen(message) , 0);
closesocket(s[i]);
}
std::cout<<"FINISHED"<<std::endl;
WSACleanup();
getchar();
return 0;
}
现在它也抛出了一个运行时错误:
WSAENOTSOCK 10038 Socket operation on nonsocket. An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket,
或者对于选择,fd_set的成员无效。
哪个(包括调试)表示在数组上创建时未正确声明套接字,建议?
你用代码创建/绑定/监听都很好。 然后:
new_socket[i] = accept(s[i] , (struct sockaddr *)&client, &c);
首先,当它运行时,你已经在循环之外,i
是 7,它已经过了套接字数组的末尾,这就是你得到 not-a-socket 错误的原因。
其次,accept()
是一个阻塞调用,因此您不能像对listen
所做的那样,只从同一线程的所有套接字上调用accept()
。 您需要为每个端口accept()
一个单独的线程块,或者找出哪个端口正在进行客户端连接尝试,例如 select
(或epoll
- Windows有吗?),然后在该特定套接字上accept()
客户端(但是您仍然必须创建一个线程来处理客户端read
/recv
s和write
/send
s或使用select
/epoll
来找出何时有输入准备好read
, 或输出缓冲区中的更多空间用于传输)。 如果您使用 select
/epoll
,还需要注意争用条件 - 侦听套接字可能表示已准备好接受客户端连接,但当您调用accept()
该连接尝试失败并忘记时,如果侦听套接字尚未设置为非阻塞模式,它将挂在那里等待另一个客户端连接到该特定套接字。 恕我直言,在这种情况下,线程实际上更容易。
我认为使用 IO 完成端口更"Windowsy"(您可能想要谷歌),但 AFAIK 它们完全不可移植。 Winsock与BSD套接字并不完全匹配,但移植或双支持的努力很小。
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- C++套接字客户端到 Python 服务器未创建连接
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- 在线程C++中创建一个套接字
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- C++ 套接字编程:创建多个流
- 在新计算机上,ZMQ上下文套接字创建要慢得多
- C 创建多个套接字客户端
- 根据C++代码在 PHP 中创建字节数据并将其传递给套接字
- 正在创建多个TCP套接字连接
- 连接到Boost.Asio创建的域套接字时权限被拒绝
- 我缺少什么来创建套接字
- 当服务器重新启动并且客户端收到WSAECONNRESET错误代码时,我应该重新创建整个套接字吗
- 在具有 DNS 名称时创建套接字
- 如何在同一程序中创建多个套接字
- 创建一个原始套接字 - Debian + 代码块
- 从服务器套接字创建守护进程处理
- 如何在c++ /QT中使用TCP服务器套接字创建Http服务器
- 如何使用QTcp-Server套接字创建HTTP MJPEG流媒体服务器