基于三次握手的端口扫描,就是不对,求大神指导
程序代码:
#include<iostream> #include<WinSock2.h> #include<errno.h> #pragma comment(lib, "ws2_32.lib") using namespace std; int main() { //地址和ip unsigned short SearchPort ; char SearchIp[20]; //关于写的指针 fd_set fdwrite; int ret; //时间结构体 timeval time; SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); cout << sockClient << endl; SOCKADDR_IN addr_ser; cout << "ip: "; cin >> SearchIp; cout << endl; addr_ser.sin_addr.S_un.S_addr = inet_addr(SearchIp); addr_ser.sin_family = AF_INET; for (SearchPort = 1; SearchPort < 1024; SearchPort++) { addr_ser.sin_port = htons(SearchPort); connect(sockClient, (SOCKADDR*) &addr_ser, sizeof(addr_ser)); time = { 3, 0 }; // select之前要清空write set FD_ZERO(&fdwrite); // 把s加入到write set里 FD_SET(sockClient, &fdwrite); if (( ret= select(0, NULL, &fdwrite, NULL, &time ) )== SOCKET_ERROR) { // cout << ret<<endl; // cout << WSAGetLastError()<<endl; // 到这里表示出现了错误 // cout << "jdfjsldjf"; } if (ret > 0) { // 到这里如果你只accept了一个socket,那么ret==1,如果你和多个socket进行io,ret的值将大于1 // 现在你要做的就是检查s是否在write set里 if (FD_ISSET(sockClient, &fdwrite)) // 如果是这样 { cout << SearchPort << " on" << endl; // socket sockClient现在处于可写状态,之后你可以调用fdwrite来获取s上的信息 } } if (ret == 0) { // 到这里如果你只accept了一个socket,那么ret==1. // 现在你要做的就是检查s是否在read set里 if (FD_ISSET(sockClient, &fdwrite)) // 如果是这样 { cout << SearchPort << "超时" << endl; // socket sockClient现在处于可写状态,之后你可以调用fdwrite来获取s上的信息 } } //***********************************************************************************************8 /*if (ret < 0) { cout << SearchPort; } if (ret == 0) { cout << SearchPort << " on" << endl; closesocket(sockClient); }*/ //*************************************************************************************************** closesocket(sockClient); } getchar(); getchar(); }
我通过TCP对它的端口进行连接,然后返回一个值来确定他的端口是否开放,可是它返回所有的值都是负数,求指导