/* * 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)); }
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; }
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; }
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; }
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; }
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; }
/* * 改进:使用多线程 线程池 测试客户端的信息 查看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 ---------- */
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; }