![]() |
#2
木头心2015-03-20 14:37
|

#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();
}
#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对它的端口进行连接,然后返回一个值来确定他的端口是否开放,可是它返回所有的值都是负数,求指导