예제 #1
0
/*
 * @param dest_ip : destination IP address  eg. "192.168.1.1"
 * @param dest_port:  destination Port
 * @param  tries: re-connect times,
 * 		<=0: try infinite times.
 * 		>0: try definite times.
 * @ret  -1: Error
 * 	 >0: socket file descriptor.
 */
int socket_client::connect(const char *dest_ip, unsigned short dest_port,
                           int tries)
{
        int ret= -1;
        int fd = socket(AF_INET, SOCK_STREAM, 0);
        if(fd <= 0) {
                return -1;
        }
        set_fd_nonblock(fd);
        set_sockopt(fd,SOCK_OPT_REUSE, SO_REUSE_ON);
        set_sockopt(fd,SOCK_OPT_LINGER, SO_LINGER_ON);
        //set_sockopt(fd, SOCK_OPT_TCPNODELAY, 1);
        struct sockaddr_in addr;
        bzero((char *)&addr, sizeof(addr));
        addr.sin_family = AF_INET;
        inet_aton(dest_ip, &addr.sin_addr);
        addr.sin_port = htons(dest_port);
        int count = 0;
        while(1) {
                if(::connect(fd, (const struct sockaddr *)&addr, sizeof(addr)) == 0)	{
                        ret =0;
                        break;
                } else {
                        if(errno == EINPROGRESS) {
                                ret = async_connect_check(fd, &count, tries);
                                break;
                        } else if(errno == EISCONN) {
				ret = 0;
				break;
			}
                        /* Re-try(connect) in case of other errors occur,
                         * until a limited re-try times has reached.
                         */
                        if((tries >0) && (++count > tries)) {
                                ret = -1;
                                break;
                        }
                }
                sleep(1);
        } /* End of while(1).*/
        if(ret >=0) {
                socket_conection_conf_t cnt;
                bzero(&cnt,sizeof(cnt));
                cnt.fd =fd;
                strncpy(cnt.target_addr, dest_ip, sizeof(cnt.target_addr));
                cnt.target_port = cnt.target_port;
                clients_conf.push_back(cnt);
                ep_add_fd(fd);
                return fd;
        }
        return -1;
}
예제 #2
0
파일: step_db.c 프로젝트: wei1225/ipflow
int main(int argc, char** argv){
	int rx_mode = DMA_MODE,tx_mode = DMA_MODE;
	int recv_mode = RECEIVE_MODE;
	char ifname[10] = {0}, *bindstr;
	char rxif[128], *pif;
	int numproc = 4, i = 0;
	
	lib_init();
	
	for(i=1; i<argc; i++){
		if(!strncmp(argv[i], "-r", 2)){
			sprintf(rxif, "%s", argv[i]+2);
		}
	}
	pif = rxif;
	sscanf(pif, "eth%d", &rx_port);
	sprintf(ifname, "eth%d", rx_port);
			
	sockfd = open_sock(ifname, rx_mode, tx_mode, recv_mode, numproc);
	if(sockfd < 0)
	{
		printf("open_sock %s failure!\n",ifname);
	}
	else
	{
		printf("open_sock %s success!\n",ifname);
	}
	
	bindstr = "1:2:3:4";
	set_sockopt(sockfd,SET_BINDING,bindstr);
	
	start_proc(sockfd);
	
	printf("start now...\n");
		
	while(1)
	{
		tIfStat rxstat;
		get_sockopt(sockfd, GET_IF_RXTX_STAT, (int *)&rxstat);
		//system("clear");
		//write_in_file(rxstat.rx_bps, rxstat.rx_pps);
		db_insert(rxstat.rx_bps*8+rxstat.rx_pps*PAD_LEN*8, rxstat.rx_pps);
        printf("eth%d %lu bps, %u pps.\n", sockfd,
            rxstat.rx_bps*8+rxstat.rx_pps*PAD_LEN*8, rxstat.rx_pps);
		sleep(10);
		//system("clear");
	}
	
	close_sock(sockfd);
	
	return 0;
}
예제 #3
0
파일: BGexec.c 프로젝트: skrieder/falkon
int con_server(int port, char* argv1)
{
    int i=1; 
    struct sockaddr_in  serv_addr;
    int sfd;
    bzero(( char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family   = AF_INET;
    serv_addr.sin_port     = htons(port);
    inet_pton(AF_INET, argv1, &serv_addr.sin_addr);
    if (flag==1)
    fprintf(stdout,"creating socket\n");

    if ( (sfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        fprintf(stdout,"client: can't open stream socket\n");
        exit(1);
    }

    //set_sockopt(sfd);
    //setsockopt(sfd, IPPROTO_TCP, TCP_CORK, &i, sizeof(i)); 


    if (flag==1)
    fprintf(stdout,"connecting\n");
    if ( connect( sfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    {
        fprintf(stdout,"client: can't connect to server\n");
        exit(2);
    }

    if (flag==1)
    fprintf(stdout,"connected!\n");
    set_sockopt(sfd);
    //setsockopt(sfd, IPPROTO_TCP, TCP_CORK, &i, sizeof(i)); 
    return sfd;
}
예제 #4
0
int main(int argc, char**argv)
{
    int  sfd,ssfd;
    char num[10];
    char clientID[22];
    char filename[100];
    int result;
    int taskSize;
    int exitCode;
    int numBytes;
    char *msg;
    char *taskID;
    char ACK[]="OK\n";
    char lifetime[]="10\n";
    Task *task;
    char *back;

    if (argc!=5)
    {
	fprintf(stdout,"usage: client <IP> <port> <port> <debug>");
	exit(1);
    }

    if (strcmp(argv[4],"-debug")==0)
  	flag=1;
    
 recover:
    if(flag == 1)
	fprintf(stdout,"con_server() to %s on port %s\n", argv[1], argv[2]);
    sfd=con_server(atoi(argv[2]), argv[1]);
    set_sockopt(sfd);
    if(flag == 1)
	fprintf(stdout,"con_server() to %s on port %s\n", argv[1], argv[3]);
    ssfd=con_server(atoi(argv[3]), argv[1]);
    
    if (flag==1)
	fprintf(stdout,"connection established!\n");
    
    
    
    /*numBytes=send(sfd, lifetime, sizeof(lifetime), 0);
      if (numBytes<0)
      {
      fprintf(stdout, "main: send lifetime error\n");
      
      fprintf(stdout,"main: error description: EOF\n");
      recovery(sfd, ssfd);
      goto recover;
      }*/
    
    while (1)
    {
	task = (Task *)malloc(sizeof(Task));
	if (task==NULL)
	    printf("failed to allocate memory in main loop\n");
	memset(filename,'\0',sizeof(filename));
	memset(clientID,'\0',sizeof(clientID));
	memset(num, '\0', sizeof(num));
	
	/*receive clientID*/
	recv_wrapper(sfd, ssfd, clientID, 22);
	if (flag==1)
	{
	    fprintf(stdout,"main: clientID: %s\n", clientID);
	}
	
	/*receive size of task*/
	recv_wrapper(sfd, ssfd, num, 10);
	if (flag==1)
	{
	    fprintf(stdout,"main: size_of_task: %s\n", num);
	}
	
	/*allocate memory for task description*/
	taskSize=atoi(num);
	msg=malloc(sizeof(char)*(taskSize+1));
	if (msg==NULL)
	{
	    fprintf(stdout,"main: allocate memory failed\n");
	    exit (1);
	}
	memset(msg,'\0',taskSize+1);
    	
	/*receive task description*/
	recv_wrapper(sfd, ssfd, msg, taskSize);
	if (flag==1)
	{
	    fprintf(stdout,"main:received: %s\n", msg);
	}
    
	/*send acknoledgement for the received task*/    
	numBytes=send(sfd, ACK,strlen(ACK),0);
	if (numBytes < 0)
	{
	    fprintf(stdout,"main: Sent ACK %s failed\n", ACK);
	    fprintf(stdout,"main: error description: EOF\n");
	    recovery(sfd, ssfd);
	    goto recover;
	}
	else
	{   
	    if (flag == 1) 
		fprintf(stdout,"main: Sent ACK %s successful (%d)\n", ACK, numBytes);
	}
	
	parseExec(msg, task);
	exitCode = run_task(task);
	/*send results back to Falkon service*/    
	numBytes = sendResults(task, ssfd, sfd);
	if (numBytes < 0)
	{
	    fprintf(stdout,"main: Send results failed\n");
	    recovery(sfd, ssfd);
	    goto recover;
	}
    
	//free(task->taskID);
	//free(task->command);
	//free(task->directory);
	free(task);
	free(msg);
	//exit(1);
    }
}
예제 #5
0
파일: BGexec.c 프로젝트: skrieder/falkon
int main(int argc, char**argv)
{
    int  sfd,ssfd;

    if (argc!=5)
    {
        fprintf(stdout,"usage: client <IP> <port> <port> <debug>");
        exit(1);
    }

    if (strcmp(argv[4],"-debug")==0)
        flag=1;
    //commented out to hopefully make it work with static compiling
    /*
    char hostname[100];
    struct hostent *h;

    gethostname(hostname, 100);
    fprintf(stdout,"hostname: %s\n", hostname);

    if ((h = gethostbyname(hostname))!=NULL)
    {
        fprintf(stdout,"ip address: %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));
    }
    */
    recover:
        fprintf(stdout,"con_server() to %s on port %s\n", argv[1], argv[2]);
    sfd=con_server(atoi(argv[2]), argv[1]);
    set_sockopt(sfd);
    fprintf(stdout,"con_server() to %s on port %s\n", argv[1], argv[3]);
    ssfd=con_server(atoi(argv[3]), argv[1]);


    if (flag==1)
    fprintf(stdout,"connection established!\n");

    char num[10];
    char clientID[22];
    char filename[100];
    int result;
    char *msg;
    char *taskID;
    char lifetime[]="10\n";
    pid_t pid;
    int n;

    /*n=send(sfd, lifetime, sizeof(lifetime), 0);
    if (n<0)
    {
        fprintf(stdout, "main: send lifetime error\n");

        fprintf(stdout,"main: error description: EOF\n");
        recovery(sfd, ssfd);
        goto recover;
    }


    char acknoledge[10];
    memset(acknoledge, '\0', 10);
    read(sfd,acknoledge,sizeof(acknoledge));
    printf("acknoledge: %s\n", acknoledge);

    fflush(stdout);*/
    while (1)
    {
        memset(filename,'\0',sizeof(filename));
        memset(clientID,'\0',sizeof(clientID));
        memset(num, '\0', sizeof(num));
        if (flag==1)
        {
            fprintf(stdout,"main: receiving from server\n");
            fprintf(stdout,"main: sizeof clientID: %d\n", sizeof(clientID));
        }

        int numBytes=0;

        int numBytesAll = 0;


        if (flag==1)
        {
            fprintf(stdout,"main:waiting to received %d bytes...\n", sizeof(clientID));
        }
        while (numBytesAll < sizeof(clientID))
        {
            numBytes = read(sfd,clientID,sizeof(clientID));
            if (numBytes<0)
            {
                fprintf(stdout,"main: Receive clientID error after %d bytes received, when it was expecting %d...\n", numBytesAll, sizeof(clientID));
                fprintf(stdout,"main: error description: %d\n", errno);
                recovery(sfd, ssfd);
                goto recover;
            }
            else if (numBytes==0)
            {
                fprintf(stdout,"main: Receive clientID error after %d bytes received, when it was expecting %d...\n", numBytesAll, sizeof(clientID));
                fprintf(stdout,"main: error description: EOF\n");
                recovery(sfd, ssfd);
                goto recover;
            }
            else
            {
            
                if (flag == 1) fprintf(stdout,"main: Received %d bytes...\n", numBytes);
            }
            numBytesAll += numBytes;
            if (numBytesAll == 3)
            {
               if (strncasecmp(clientID, "end", 3)==0)
               {
               
                   fprintf(stdout, "main: receive end notice, exit\n");
                   //should shut down gracefully... closing all sockets...
                   //exit(0);
		   goto recover;
               }
            }
        }

        if (flag==1)
        {
            fprintf(stdout,"main:just received %d bytes...\n", numBytesAll);
        }

        fflush(stdout);
        if (flag==1)
        {
            fprintf(stdout,"main: clientID: %s\n", clientID);
        }

        numBytesAll = 0;


        if (flag==1)
        {
            fprintf(stdout,"main:waiting to received %d bytes...\n", sizeof(num));
        }


        while (numBytesAll < sizeof(num))
        {
            numBytes = read(sfd,num,sizeof(num));
            if (numBytes<0)
            {
                fprintf(stdout,"main: Receive task size error after %d bytes received, when it was expecting %d...\n", numBytesAll, sizeof(num));
                fprintf(stdout,"main: error description: %d\n", errno);
                recovery(sfd, ssfd);
                goto recover;
            }
            else if (numBytes==0)
            {
                fprintf(stdout,"main: Receive task size error after %d bytes received, when it was expecting %d...\n", numBytesAll, sizeof(clientID));
                fprintf(stdout,"main: error description: EOF\n");
                recovery(sfd, ssfd);
                goto recover;
            }
            else
            {
            
                if (flag == 1) fprintf(stdout,"main: Received %d bytes...\n", numBytes);
            }
            numBytesAll += numBytes;
        }
        if (flag==1)
        {
            fprintf(stdout,"main:just received %d bytes...\n", numBytesAll);
        }



        int taskSize=atoi(num);
        msg=malloc(sizeof(char)*(taskSize+1));
        memset(msg,'\0',sizeof(msg));
        if (msg==NULL)
        {
            fprintf(stdout,"main: allocate memory failed\n");
            exit (1);
        }


        if (flag==1)
        {
            fprintf(stdout,"main:waiting to receive task description of %d bytes...\n", taskSize);
            //fprintf(fp,"main:received: %s\n", msg);
        }
	char buffer[10240];
        numBytesAll = 0;
        while (numBytesAll < taskSize)
        {
	    memset(buffer, 0, 10240);
            numBytes = read(sfd,buffer,taskSize);
	    strcat(msg, buffer);
            if (numBytes<0)
            {
                fprintf(stdout,"main: Receive task failed after %d bytes received, when it was expecting %d...\n", numBytesAll, taskSize);
                fprintf(stdout,"main: error description: %d\n", errno);

                recovery(sfd, ssfd);
                goto recover;
            }
            else if (numBytes==0)
            {
                fprintf(stdout,"main: Receive task failed after %d bytes received, when it was expecting %d...\n", numBytesAll, sizeof(clientID));
                fprintf(stdout,"main: error description: EOF\n");
                recovery(sfd, ssfd);
                goto recover;
            }
            else
            {
            
                if (flag == 1) fprintf(stdout,"main: Received %d bytes...\n", numBytes);
            }
            numBytesAll += numBytes;
        }


        if (flag==1)
        {
            fprintf(stdout,"main:jst received %d bytes...\n", numBytesAll);
        }


        if (flag==1)
        {
            fprintf(stdout,"main:received: %s\n", msg);
        }

	
	//commented out ACK
        numBytes=send(sfd, ACK,strlen(ACK),0);
        if (numBytes < 0)
        {
            fprintf(stdout,"main: Sent ACK %s failed\n", ACK);
            fprintf(stdout,"main: error description: EOF\n");
            recovery(sfd, ssfd);
            goto recover;
        }
        else

        {   
            if (flag == 1) fprintf(stdout,"main: Sent ACK %s successful (%d)\n", ACK, numBytes);

        }
	

        fflush(stdout);

        taskID = getTaskID(msg);
        int exitCode;
        exitCode = parseExec(msg);


        free(msg);
        numBytes = sendResults(taskID, exitCode, argv, ssfd, sfd);

        if (numBytes < 0)
        {
            fprintf(stdout,"main: Send results failed\n");
            //fprintf(stdout,"main: error description: EOF\n");
            recovery(sfd, ssfd);
            goto recover;
        }

    }
}