I wrote a simple port scanner that is dog slow in Windows (Had to make some modifications for it to work under Windows obviously but it's working. Under a Linux distro it's lightning fast:
Code:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
#define PORT_MIN 0x0000
#define PORT_MAX 0xFFFF
#pragma comment(lib, "ws2_32.lib")
void test_port(SOCKET, struct sockaddr_in *, unsigned short, char *);
void print_port();
int main(int argc, char ** argv){
SOCKET client_socket;
WSADATA wsaData;
struct sockaddr_in target;
unsigned short port = PORT_MIN;
WSAStartup(MAKEWORD(2, 2), &wsaData);
memset(&target, sizeof(target), 0);
if((target.sin_addr.s_addr = inet_addr(argv[1])) != INADDR_NONE)
while(port++ < PORT_MAX)
test_port(client_socket, &target, port, "tcp");
return 0;
}
void test_port(SOCKET client_socket, struct sockaddr_in * target, unsigned short port, char * svc_proto){
struct servent * service;
printf("Testing %s port %u\r", svc_proto, port);
target->sin_family = AF_INET;
target->sin_port = htons(port);
if((client_socket = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET)
if(connect(client_socket, (struct sockaddr *)target, sizeof(*target)) != SOCKET_ERROR){
closesocket(client_socket);
if(service = getservbyport(port, svc_proto))
printf("Discovered open port %u (%s)/%s\n", port, service->s_name, svc_proto);
else
printf("Discovered open port %u/%s\n", port, svc_proto);
}
}