J'ai donc développé un scanner de port pour C sur windows mais j'ai remarqué sur certaines IP qu'il fonctionne très lentement. Voici mon code pour elle:Speedup Windows C Port Scanner
DWORD WINAPI connectPortW(LPVOID lpParam)
{
HANDLE hStdout;
PMYDATA pDataArray;
WSADATA firstsock;
SOCKET s;
struct sockaddr_in sa;
int err;
char * openPorts = (char *)malloc(sizeof(char)*256);
memset(&openPorts[0], 0, strlen(openPorts));
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(hStdout == INVALID_HANDLE_VALUE)
{
return 1;
}
pDataArray = (PMYDATA)lpParam;
strncpy((char *)&sa,"",sizeof sa);
sa.sin_family = AF_INET;
if (WSAStartup(MAKEWORD(2,0),&firstsock) != 0)
{
fprintf(stderr,"WSAStartup() failed");
exit(1);
}
sa.sin_addr.s_addr = inet_addr(pDataArray->ip);
s = socket(AF_INET, SOCK_STREAM, 0); //make net a valid socket handle
if(s < 0)
{
perror("\nSocket creation failed"); // perror function prints an error message to stderr
exit(1);
}
sa.sin_port = htons(pDataArray->port);
err = connect(s, (struct sockaddr *)&sa, sizeof sa);
//connection not accepted
if(err == SOCKET_ERROR)
{
printf("%s %-5d Winsock Error Code : %d\n", pDataArray->ip, pDataArray->port, WSAGetLastError());
strcpy("NULL", openPorts);
fflush(stdout);
}
//connection accepted
else
{
printf("%s %-5d accepted \n", pDataArray->ip, pDataArray->port);
sprintf(openPorts, "%i,", pDataArray->port);
if(shutdown(s, SD_BOTH) == SOCKET_ERROR)
{
perror("\nshutdown");
exit(1);
}
}
closesocket(s);
fflush(stdout);
strcpy(pDataArray->openPorts, openPorts);
free(openPorts);
return 0;
}
Gardez à l'esprit que je l'utilise déjà des fils et chaque thread appelle cette fonction pour un autre port (0-1024) sur la même adresse IP.
Alors, comment puis-je accélérer cela? Je continue de voir des gens parler de non-blocage, est-ce que cela accélérerait le processus et si oui, comment puis-je l'appliquer? Merci!
Edit: Il prend 614 secondes (10 minutes) pour numériser 0-1024 sur l'un des mentionné ci-dessus « lent »
de ipEdit 2: Je commencé à essayer d'utiliser non bloquante ... Suis-je est-ce que c'est bien?
ioctlsocket(s, FIONBIO, &on);
connect(s, (struct sockaddr *)&sa, sizeof sa);
FD_ZERO(&fds);
FD_SET(s, &fds);
err = select(s, &fds, &fds, &fds, &tv);
if (err != SOCKET_ERROR && err != 0)
{
sprintf(openPorts + strlen(openPorts),"%i,", pDataArray->port);
}
closesocket(s);
Édition 3: Il semble que cette nouvelle méthode me donne des résultats inexacts mais beaucoup plus rapidement. J'ai l'impression d'avoir des ports plus ouverts que les résultats de l'exécution de nmap sur la même adresse IP.
Savez-vous ce que vos goulots d'étranglement sont? L'avez-vous profilé? –
Non, je n'ai aucune idée de ce qui goute, comment pourrais-je essayer de comprendre ce qui goute? –
en utilisant asynchrone io vous ne pouvez pas accélérer la réponse de certaines IP spécifiques. cela ne dépend pas du tout de votre code. mais en utilisant io asynchrone - vous pouvez rendre votre code beaucoup plus efficace et moins d'utilisation des ressources. 1024 discussions c'est un cauchemar. avec io asynchrone vous utilisez uniquement pool de threads avec nombre fixe de threads (habituel un thread par cœur) – RbMm