Linux C基於Socket的多線程掃描程序



#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
char strIP[20];
int nPort=0;
int nThreadNum=0;
int nThreadCurNum=0;

void* ProcessThreadProc(void *pPara)
{
   	struct sockaddr_in serverAddr;
	int clientSocket;
	char sendbuf[200];
	char recvbuf[200];
	if((clientSocket=socket(AF_INET,SOCK_STREAM,0)) < 0)
	{
		nThreadCurNum--;
		perror( "socket error" );
		return NULL; 		
	}
	
	serverAddr.sin_family=AF_INET;
	serverAddr.sin_port=htons(nPort);
	serverAddr.sin_addr.s_addr=inet_addr(strIP);
	if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < 0)
	{
		nThreadCurNum--;
		perror( "Connect error" );
		return NULL; 	
	}	
	printf("Connect with destination host OK .....\n");
	while(1)
	{
		sleep(1);
	}
	close(clientSocket);
	nThreadCurNum--;
	return NULL;
}
main()
{	
	int i = 0;
	int nFlag = 0;
	int nSuccessNum = 0;
	printf("Input IP:>");
	scanf("%s",strIP);
	printf("%s\n",strIP);
	printf("Input Port:>");
	scanf("%d",&nPort);
	printf("%d\n",nPort);
	printf("Input Thread NuM:>");
	scanf("%d",&nThreadNum);
	printf("%d\n",nThreadNum);
	nThreadCurNum = nThreadNum;

	for(i=0; i < nThreadNum; i++)
	{
		pthread_t num;
		nFlag = pthread_create(&num, NULL, ProcessThreadProc, (void *)i);
		if(nFlag != 0)
		{
			printf("Error: Thead Error [%d]....\n",i);
			nThreadCurNum--;
		}
		else
			nSuccessNum++;
	}
	printf("Success Num: %d Failed Num: %d \n",nSuccessNum,nThreadNum-nSuccessNum);

	while(true)
	{
		printf("Current Num: %d\n",nThreadCurNum);
		sleep(2);
	}	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章