This code ruined all my day. Basically I have a list of 50 webservers I administrate, I want to check them if up/alive (isAlive() function), I parse my webservers.txt file with the 50 ips/hostnames and for fastness I try to use threads (10, 20 or 30 doesn't matter) then my compiled code seems only duplicate threads with the last line in my file.
hosts.txt (11 lines in it)Code:#include <windows.h> #include <stdio.h> #include <string.h> #include <winsock.h> #include <process.h> #include <string.h> #pragma comment(lib, "wsock32.lib") unsigned int _stdcall isAlive(void *ptr) { struct sockaddr_in blah; struct hostent *he; WSADATA wsaData; int i; WORD wVersionRequested; SOCKET sock; char* addr = (char*)ptr; char buff[1024]; char *ex; ex="GET /alive.php HTTP/1.0\n\n"; char *fmsg="ALIVE"; wVersionRequested = MAKEWORD(1, 1); if (WSAStartup(wVersionRequested , &wsaData)){ printf("Winsock Initialization failed.\n"); return(1); } if ((sock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET){ printf("Can not create socket.\n"); return(1); } sock = socket(AF_INET,SOCK_STREAM,0); blah.sin_family = AF_INET; blah.sin_port = htons(80); blah.sin_addr.s_addr = inet_addr(addr); if ((he=gethostbyname(addr))!=NULL){ memcpy((char *)&blah.sin_addr.s_addr,he->h_addr,he->h_length); } else{ if((blah.sin_addr.s_addr=inet_addr(addr))==-1){ WSACleanup(); return(1); } } if (connect(sock,(struct sockaddr*)&blah,sizeof(blah))==0){ send(sock,ex,strlen(ex),0); recv(sock,buff,sizeof(buff),0); if(strstr(buff,fmsg)!=NULL){ printf("ALIVE: %s\n", addr); } } closesocket(sock); WSACleanup(); _endthreadex(0); return(1); } int main(int argc,char *argv[]) { if(argc!=2){ printf("Usage: %s <webservers list>\n", argv[0]); return(1); } char *inname = argv[1]; FILE *infile; char line_buffer[BUFSIZ]; char line_number; infile = fopen(inname, "r"); if (!infile) { printf("Couldn't open file %s for reading.\n", inname); return 0; } line_number = 0; HANDLE hThreadArray[200]; while (fgets(line_buffer, sizeof(line_buffer), infile)) { unsigned threadID; hThreadArray[line_number] = (HANDLE)_beginthreadex(0, 0, isAlive, line_buffer, 0, &threadID); ++line_number; } WaitForMultipleObjects(line_number, hThreadArray, TRUE, INFINITE); fclose(infile); return 0; }
result:myhost.com
mysecondhost.com
...
mylasthost.com
C:\Documents and Settings\Xtmtrx\Desktop\Code>checkalive.exe hosts.txt
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com
ALIVE: mylasthost.com


Reply With Quote
Bookmarks