Пример #1
0
/*
 * Open the file by sending the "name" and "oflag" to the
 * connection server and reading a file descriptor back.
 */
int csopen(char *name, int oflag)
{
    int len;
    char buf[12];
    struct iovec iov[3];
    static int csfd = -1;

    if (csfd < 0) {		/* open connection to conn server */
	if ((csfd = cli_conn(CS_OPEN)) < 0) {
	    err_ret("cli_conn error");
	    return(-1);
	}
    }

    sprintf(buf, " %d", oflag);		/* oflag to ascii */
    iov[0].iov_base = CL_OPEN " "; /* string concatenation */
    iov[0].iov_len = strlen(CL_OPEN) + 1;
    iov[1].iov_base = name;
    iov[1].iov_len = strlen(name);
    iov[2].iov_base = buf;
    iov[2].iov_len = strlen(buf) + 1;	/* null always send */
    len = iov[0].iov_len + iov[1].iov_len + iov[2].iov_len;
    if (writev(csfd, &iov[0], 3) != len) {
	err_ret("writev error");
	return(-1);
    }

    /* read back descriptor; returned errors handled by write() */
    return(recv_fd(csfd, write));
}
Пример #2
0
int main(void)
{
	int fd, n;
	char buf[1024];

	fd = cli_conn("foo.socket");
	if (fd < 0)
	{
		switch(fd)
		{
			case -4:perror("conncet");break;
			case -3:perror("listen");break;
			case -2:perror("bind");break;
			case -1:perror("socket");break;
		}
		exit(-1);
	}
	while(fgets(buf, sizeof(buf), stdin) != NULL)
	{
		write(fd, buf, strlen(buf));
		n = read(fd, buf, sizeof(buf));
		write(STDOUT_FILENO, buf, n);
	}
	close(fd); 
	return 0;
}
Пример #3
0
int hs(int argc, char **argv)
{
	int serv_fd = -1;
	char *sendbuf;
	int res;

	serv_fd = cli_conn();
	
	if(argc < 2) {
		hs_usage();
		res = -1;
		goto failed;
	} else if ((!strcmp(argv[1], "add"))||
				(!strcmp(argv[1], "del"))||
				(!strcmp(argv[1], "get"))) {
		if(argc < 3) {
			hs_usage();
			res = -1;
			goto failed;
		}

		/* send cmd to hash message server */
		sendbuf = malloc(4 + strlen(argv[2]) + 1);
		if(!sendbuf) {
			dlog(L_ERR, "malloc send buffer error\n");
			res = -ENOMEM;
			goto failed;
		}
		sprintf(sendbuf, "%s ", argv[1]);
		sprintf(sendbuf + 4, "%s", argv[2]);

		dlog(L_DBG, "send cmd: [%s] ...\n", sendbuf);
		
		if(cli_send_cmd(serv_fd, sendbuf))
			dlog(L_ERR, "send cmd:[%s %s] error\n", argv[1], argv[2]);
		
		free(sendbuf);
	} else if ((!strcmp(argv[1], "commit"))){
		dlog(L_DBG, "send cmd: [%s] ...\n", argv[1]);
		if(cli_send_cmd(serv_fd, argv[1]))
			dlog(L_ERR, "send command: [commit] error\n");
	} else {
		dlog(L_ERR, "invalid command\n");
		res = -1;
		goto failed;
	}
	if(!strcmp(argv[1], "get")){
		res = cli_recv_server_msg(serv_fd, 100000);
	}
	res = cli_recv_server_msg(serv_fd, 100000);
	dlog(L_DBG, "get server ack %d\n", res);

failed:
	if(serv_fd !=-1 )
		cli_disconn(serv_fd);
	return res;
}
Пример #4
0
int main(void) {
	int fd, n;
	char buf[128] = {0};

	if((fd = cli_conn("foo.socket")) < 0)
		err_quit("cli_conn error");

	while((n = read(fd, buf, sizeof(buf))) > 0)
		printf("%s\n", buf);

	return 0;
}
Пример #5
0
static int hookup(const char *sockdir)
{
  char *master_addr;
  int  master_fd;

  check_sockdir(sockdir);
  master_addr = path_join(sockdir, MON_SOCK);
  master_fd = cli_conn(master_addr);
  if (master_fd < 0)
    errx(2, "Cannot connect to mdm-master");
  free(master_addr);
  return master_fd;
}
Пример #6
0
int main(int argc, char *argv[])
{
    struct stat sock_stat;
    char        *master_addr;
    bool        sync_mode;
    int         master_fd, status;
    job         job;

    if (argc < 2)
        errx(1, "Please supply command as arguments");

    master_addr = getenv(CMD_SOCK_VAR);
    if (!master_addr)
        if (execvp(*argv, ++argv) < 0)
            errx(2, "execve: %s", *argv);

    if (lstat(master_addr, &sock_stat) < 0)
        err(3, "%s: Cannot stat master socket", master_addr);
    if (!S_ISSOCK(sock_stat.st_mode))
        errx(4, "%s: Not a socket", master_addr);
    if (sock_stat.st_uid != geteuid())
        errx(5, "%s: Belongs to someone else", master_addr);

    master_fd = cli_conn(master_addr);
    if (master_fd < 0)
        errx(6, "%s: cli_conn error", master_addr);

    sync_mode = !strcmp(basename(*argv), "mdm-sync");
    write_int(master_fd, sync_mode ? 2 : 1);

    job.cwd = open(".", O_RDONLY);
    job.cmd.svec = ++argv;
    job.env.svec = environ;
    write_job(master_fd, &job);
    readn(master_fd, &status, sizeof (int));

    if (sync_mode)
        if (execvp(*argv, argv) < 0)
            errx(2, "execve: %s", *argv);

    readn(master_fd, &status, sizeof (int));
    close(master_fd);

    return status;
}
Пример #7
0
/*
 * 改进:使用多线程 线程池 测试客户端的信息 查看connect后自动分配的信息
 * 来报文写到文件中
 * 使用进程监控状态自动重启
 * 系统守护进程
 */
int main ( int argc, char *argv[] )
{
    struct addrinfo     *ailist;
    int                 listenfd;
    int                 unixfd;
    char                *host;
    char                buf[128];

#ifdef DEBUG
    /* 进程和客户端无关 后台执行 */
    signal(SIGHUP,SIG_IGN);//终端推出
    signal(SIGINT,SIG_IGN);//ctrl+C
    signal(SIGCLD,SIG_IGN);//子进程退出时发送的信号

    if( fork() != 0 )
        exit(0);
    else
        setpgrp();
#endif

    signal(SIGALRM,SIG_IGN);//子进程退出时发送的信号

    /* 第一次执行 */
    if(!sonpid)
        initson();

#if defined(Darwin)
    atexit(killson);
#endif

    /* 自己的unix域连接 */
//    sleep(1);
//    if((unixfd=cli_conn(UNIXFILE))<0)
//        err_sys( "cli_conn error" );


    /* 父进程获取外部数据 由wrfd写到子进程 由子进程处理业务 */
    //setenvadd( "LD_LIBRARY_PATH", "/home/cbs/priv/xcz/project/src", 1 );
    /* 获取本机主机名 */
    if( (host=getmyname( )) == NULL )
        err_sys( "get host name err" );

    printf("%s\n", host);
    /* 根据主机名和端口号初始化sockaddr结构 */
//    preconnect( host, "12345", SOCK_STREAM, &ailist );
//    free( host );
//    host = NULL;
//    //    printf("%hu\n", ntohs((( struct sockaddr_in * )( ailist->ai_addr ))->sin_port));
//    //    struct in_addr saddr;
//    //    saddr=(( struct sockaddr_in * )( ailist->ai_addr ))->sin_addr;
//    //    struct sockaddr a;
//    //    a=*( ailist->ai_addr );
//    //    printf("AF_INET %d %d\n", a.sa_family, AF_INET);
//    /*   侦听所有网卡 */
//    (( struct sockaddr_in * )(ailist->ai_addr))->sin_addr.s_addr=htonl( INADDR_ANY );
//    /* 打印一些信息 */
//    zl_connect_out_func( ailist->ai_addr );
//    /* 绑定端口 声明最大连接数 */
//    if ( ( listenfd = initserver( ailist->ai_socktype, ailist->ai_addr, ailist->ai_addrlen, 200 ) ) < 0 )
//    {
//        err_sys( "initserver err" );
//    }
//    freeaddrinfo( ailist );

    struct sockaddr_in  addr;
    struct sockaddr     *addrp;
    int                 socktype;
    socklen_t           addrlen;
    memset( &addr, 0x00, sizeof(addr) );
    addr.sin_family = AF_INET;
    addr.sin_port = htons(12345);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    addrlen=sizeof(struct sockaddr);
    addrp=(struct sockaddr *)&addr;
    /* 绑定端口 声明最大连接数 */
    if ( ( listenfd = initserver( SOCK_STREAM, addrp, addrlen, 100 ) ) < 0 )
    {
        err_sys( "initserver err" );
    }
    zl_connect_out_func( addrp );

    unsigned long addrsize;
    int           connectfd;
    int           n,i;
    char          *p=NULL;
    char          recvbuf[SIZERCV+1];

    addrsize = sizeof( struct sockaddr );


    if(0)
    {
        i=0;
        costtime(0);
        system("date");
        while(++i<20000)
        {
            /* 自发送 测试unix域套接字效率 */
            if((unixfd=cli_conn(UNIXFILE))<0)
            {
            printf("%s%d\n",AT,i);
            fflush(NULL);
                err_sys( "%scli_conn error %d", AT, unixfd );
            }
            switch(i%7)
            {
                case 0:
                    sprintf(buf,"%d 111",i);
                    break;
                case 1:
                    sprintf(buf,"%d 121",i);
                    break;
                case 2:
                    sprintf(buf,"%d 314",i);
                    break;
                case 3:
                    sprintf(buf,"%d 315",i);
                    break;
                case 4:
                    sprintf(buf,"%d 604",i);
                    break;
                case 5:
                    sprintf(buf,"%d 900",i);
                    break;
                case 6:
                    sprintf(buf,"%d 990",i);
                    break;
            }
            if((n=write( unixfd, buf, strlen(buf) ))<0)
                printf("%s,send faild %s\n", AT, strerror(errno));
            close( unixfd );

            if(i%100==0)
                printf("%d %lf\n", i, costtime(1));
        }
        system("date");
    }


    while(1)
    {
        /* 这样单节点的accept对大并发的支持简直惨不忍睹 2w笔来账单纯接收不进行任何处理花了70s
         * 而使用select+多线程只需要10s 还是服务器运行在台式机虚拟机2核cpu 1G内存的情况下
         */
        if (( connectfd = accept( listenfd, NULL, ( socklen_t *)&addrsize ) ) == -1 )
        {
            printf( "%saccept err", AT );
            continue;
        }
        i=0;
        p=NULL;
        while( (n = recv( connectfd, recvbuf, SIZERCV, 0 )) > 0 )
        {
            recvbuf[n]=0;
            if (p)
                p=realloc(p,strlen(p)+n+1);
            else
                p=malloc(n+1);
            strcpy( p+i, recvbuf );
            i+=n;
        }
        close( connectfd );
        if (n<0)
            printf("%s,recv out err %d\n", AT,n);
//        printf("%s %s\n", AT, p);
        n=0;
        do
        {
            if((unixfd=cli_conn(UNIXFILE))<0)
            {
                /* 来的数据太多 unix域套接字connect的时候 会refuse 重新尝试就好
                 * 经测试 也就尝试140次左右可connect成功
                 */
                n++;
                if(!(n&0xFF))//256的倍数打印
                  printf( "%scli_conn error %d retried %d times", AT, unixfd, n );
                continue;
            }
        }while(0);
        write(unixfd, p, i);
        close( unixfd );
        free(p);
        p=NULL;
    }
    close( listenfd );



    return EXIT_SUCCESS;
}				/* ----------  end of function main  ---------- */
Пример #8
0
int main(int argc, char **argv)
{

	char buf[BUFSIZE];
	int n,connfd;
	int server_sock,client_sock;
	socklen_t server_len,client_len;
	struct sockaddr_in server,client;

	char filename[MAXLINE];
	char new_filename[MAXLINE];
	char *pic_filename = "../ad_machine/picture/";
	char *video_filename = "../MPlayer-1.0rc3/";
	int  filelen;
	int fd, dl;
	char flag_n;
	int flag_trsf_movie = 0;
	int flag_trsf_pic = 0;
	char scces = 'y';

	pid_t pid = 0;

	struct sigaction myact;
	myact.sa_handler = mywait;
	myact.sa_flags = 0;
	sigaction(SIGCHLD,&myact,NULL);

	/*if(create_process(&pid) == -1)
	{
		exit(-1);                  
	}*/
     
	// 1. socket

	server_sock = socket(AF_INET, SOCK_STREAM, 0);
	if(server_sock < 0)
	{
		printf("create socket failed!\n");
		exit(1);
	}

	// 2. bind

	server_len = sizeof(server);
	bzero(&server, server_len);
	server.sin_family = AF_INET;
	server.sin_port = htons(SERVER_PORT);
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	if(bind(server_sock, (struct sockaddr *)&server, server_len) < 0)
	{
		printf("bind to port %d failed!\n", SERVER_PORT);
		exit(2);
	}

	// 3. listen

	if(listen(server_sock, 10) < 0)
	{
		printf("listen is failed!\n");
		exit(3);
	}

	// 4. accept

	while(1)
	{
		flag_trsf_movie = 0;
		flag_trsf_pic = 0;
		client_len = sizeof(client);
		client_sock = accept(server_sock, (struct sockaddr *)&client, &client_len);

		if(client_sock < 0)
		{
			printf("accept is failed!\n");
			close(server_sock);
			exit(4);
		}

		n = read(client_sock, &flag_n, 1);
		if(flag_n == '3')
		{
			strcpy(buf,"flush");
			buf[5] = '\0';
			goto ipc_conn;      
		}
		if(flag_n == '1')
		{
			bzero(buf,sizeof(buf));
			n = write(client_sock, &flag_n, 1);
			n = Read(client_sock, buf, BUFSIZE);
			close(client_sock);
		}
		else if(flag_n == '2')

		{
			for(;;){
				
				n = Write(client_sock, &flag_n, 1);

				Read(client_sock, filename, MAXLINE);
				printf("filename :%s\n",filename);
				
				if(strstr(filename, ".rmvb") || strstr(filename,".flv") || strstr(filename, ".mp4"))
				{
					strcpy(new_filename, video_filename);
					flag_trsf_movie = 1;
				}
				else if(strstr(filename, ".jpeg") || strstr(filename,".jpg") 
                                       || strstr(filename, ".bmp")|| strstr(filename, ".gif"))
				{
					strcpy(new_filename, pic_filename);
					flag_trsf_pic = 1;
				}
				strcat(new_filename, filename);

				if((fd = open(new_filename, O_CREAT | O_RDWR, S_IRWXU)) == -1){
					perror("file create");
					send_no(client_sock);
					break;
				}
				if((dl = open("../MPlayer-1.0rc3/play.txt", O_CREAT |O_TRUNC |O_RDWR, 777)) == -1){
					perror("create file error");
					return 0;
				}

				Write(dl, filename, strlen(filename));

				Write(client_sock, &scces, 1);

				Read(client_sock, &filelen, sizeof(filelen));


				if(filelen <= 0){
					send_no(client_sock);
					break;
				}
				scces = 'y';
				Write(client_sock, &scces, 1);
				n = ftruncate(fd,filelen);
				lseek(fd, 0, SEEK_SET);

				while((n = Read(client_sock, buf, BUFSIZE))){
					Write(fd, buf, n);
				}


				close(dl);
				break;
			}// end for(;;)
			close(client_sock);
			close(fd);
			
			if(flag_trsf_movie == 1){
				kill(pid, SIGKILL);
				if(create_process(&pid) == -1)
				{
					exit(-1);                        
				}

				continue;
			}//end if(flag_trsf_movie)
		}//end else if(flag_n == 2)

ipc_conn:
		/* as client for Qt*/
		if((connfd = cli_conn("/tmp/my_unix.socket")) < 0)
		{
			if(connfd == -1)
			{
				perror("socket error");
				exit(1);
			}
			else if(connfd == -2)
			{
				perror("bind error");
				exit(1);
			}
			else if(connfd == -4)
			{
				perror("connect error");
				exit(1);
			}
		}
		if(flag_trsf_pic == 1)
		{
			bzero(buf,sizeof(buf));
			strcpy(buf, "getpic");
			buf[6] = '\0'; 
		}

		n = write(connfd, buf, strlen(buf) + 1);

		//客户端关闭套接字,服务端read会返回0
		close(connfd);


	} //end while(1)
	return 0;  
}