void accept_client(int sockfd) { int newfd, count_fd = 0; struct sockaddr_in client_addr; socklen_t len = sizeof(struct sockaddr_in); while(1) { if((newfd = accept(sockfd, (struct sockaddr *)&client_addr, &len)) == ERR) pri_err("accept"); printf("user:%s connect, port %d\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port)); while(count_fd < MAX_USER) { if(clients[count_fd].sockfd == SOCKET_OK) { clients[count_fd].sockfd = newfd; DEBUG("clients[%d]sockfd = %d\n", clients[count_fd].sockfd); break; } } if((pthread_create(&clients[count_fd].tid, NULL, pthread_func,&clients[count_fd].sockfd)) == ERR) pri_err("pthread_create"); count_fd++; } close(sockfd); close(newfd); }
void upload_file(sLoginInfo *send, int32 newfd) { int32 fd, nwrite = 0; if((fd = open(send->file.pwd, O_CREAT|O_WRONLY|O_TRUNC, 0644)) == ERR) pri_err("open upload file"); memset(send->file.buff, 0, sizeof(send->file.buff)); nwrite = writen(fd, &send->file.buff, sizeof(send->file.buff));//len? if(nwrite < 0) pri_err("writen"); close(fd); }
void register_user(sLoginInfo *send, int newfd) { pthread_mutex_lock(&g_mutex); char *file[3]; char read_buf[BUF_SIZE] = {0}; char all_buf[BUF_SIZE] = {0}; int i,back_type = 0; int fd, nwrite, enter_write; int user_login_flag = 0; off_t off_len = 0; if((fd = open(FILENAME,O_CREAT|O_RDWR|O_APPEND,0644)) == ERR) pri_err("open"); while(1) { lseek(fd, off_len, SEEK_SET); if(read(fd, read_buf, BUF_SIZE) == 0) { break; }else{ i = 0; char str[BUF_SIZE] = {0}; strcpy(str, read_buf); file[i++] = strtok(read_buf,":"); while(file[i++] = strtok(NULL,":")) ; if(strcmp(file[0], send->login_name) == OK) { user_login_flag = REGIST_EXITED; break; } off_len += strlen(str) + 2; memset(str, 0, sizeof(str)); } } if(user_login_flag == REGIST_EXITED) { send->type = REGIST_EXITED; //type 51 write(newfd, send,sizeof(sLoginInfo)); }else{ sprintf(all_buf, "%s:%s",send->login_name,send->login_passwd); nwrite = write(fd, all_buf,strlen(all_buf)+1); enter_write = write(fd, "\n", 1); if(nwrite != 0 && enter_write != 0) { send->type = REGIST_SUCCESS;//type 52 write(newfd, send, sizeof(sLoginInfo)); }else{ send->type = REGIST_FAILED;//type 50 write(newfd, send, sizeof(sLoginInfo)); } } pthread_mutex_unlock(&g_mutex); close(fd); }
int main(void) { int sockfd; pthread_t udp_tid; struct sockaddr_in serv_addr; struct sockaddr_in udp_ser_addr; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == ERR) pri_err("socket"); bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; udp_ser_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); udp_ser_addr.sin_port = htons(5000); //inet_pton(AF_INET, IP, &serv_addr.sin_addr); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); udp_ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); int udp_sock = socket(AF_INET, SOCK_DGRAM, 0); if(udp_sock < 0) { perror("socket udp"); exit(1); } if(bind(udp_sock, (struct sockaddr *)&udp_ser_addr, (socklen_t)sizeof(struct sockaddr)) < 0) { perror("bind"); exit(1); } pthread_create(&udp_tid, NULL, pthread_udp,&udp_sock); //端口重用 int on = 1; if((setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) == ERR) pri_err("setsockopt"); if((bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) == ERR) pri_err("bind"); if((listen(sockfd, MAX_USER)) == ERR) pri_err("listen"); printf("waitting client connection…………\n"); accept_client(sockfd); return 0; }
void down_file(sLoginInfo *send, int32 newfd) { int32 fd, nread = 0; if((fd = open(send->file.pwd, O_RDONLY)) == ERR) pri_err("open down file"); memset(send->file.buff, 0, sizeof(send->file.buff)); while((nread = read(fd, send->file.buff, sizeof(send->file.buff))) > 0) { usleep(500);// wait 0.5 ms writen(newfd, &send->file.buff, nread); } close(fd); }
void check_login(sLoginInfo *send, int newfd) { char *file[3]; char read_buf[BUF_SIZE] = {0}; char all_buf[BUF_SIZE]; int i = 0; int fd, nwrite, enter_write; int user_login_flag = 0; off_t off_len = 0; if((fd = open(FILENAME, O_RDONLY,0644)) == ERR) pri_err("open file"); while(1) { lseek(fd, off_len, SEEK_SET); if(read(fd, read_buf,BUF_SIZE) == 0) break; off_len += strlen(read_buf) + 2; i = 0; file[i++] = strtok(read_buf,":"); while(file[i++] = strtok(NULL, ":")) ; if(strcmp(file[0], send->login_name) == OK) { if(strcmp(file[1], send->login_passwd) == OK) { if(init_user(file)) send->type = USER_LOGIN_FAILED_ONLINE;//user online else { send->type = USER_LOGIN_SUCCESS; } break; }else{ send->type = USER_LOGIN_PASSWD_ERROR;//passwd error break; } }else{ send->type = USER_LOGIN_FAILED;//no user name } memset(read_buf, 0,sizeof(read_buf)); } write(newfd, send, sizeof(sLoginInfo)); get_online_user(send,newfd ); close(fd); }
void list_file(sLoginInfo *send, int newfd) { DIR *dir; struct dirent *dp; if((dir = opendir("~/file")) == NULL) pri_err("opendir"); memset(send->file.buff,0 ,sizeof(send->file.buff)); while((dp = readdir(dir)) != NULL) { if((strcmp(dp->d_name, ".") == OK) || strcmp(dp->d_name, "..") == OK) continue; strcat(send->file.buff, dp->d_name); strcat(send->file.buff, " "); } writen(newfd, send->file.buff,strlen(send->file.buff)+1 ); close(newfd); }
CELLP eval(CELLP form, CELLP env) { //static int e = 0; //static char tabs[100]; CELLP cp, apply(), atomvalue(), evallist(); ATOMP func; //tabs[e] = ' '; //tabs[++e] = '\0'; //printf("\n%s%d: form=", tabs, e); //printf("省略"); //print_s(form, ESCON); //printf("\n"); //if(e>150){ //printf(", env="); //print_s(env, ESCON); //printf("\n"); //} switch(form->id) { case _ATOM: cp = atomvalue((ATOMP)form, env); break; case _FIX: case _FLT: //printf("\n%s%d: result=(NUM)", tabs, e); //print_s(form,ESCON); //printf("\n"); //tabs[--e] = '\0'; return form; case _CELL: // stackcheck; //スタックポインタを進める *++sp = (CELLP)nil; stackcheck; //printf("=%d= ", __LINE__); func = (ATOMP)form->car; //printf("=%d= ", __LINE__); {//N// int q = on(&form); on(&env); //on(sp);//N// on((CELLP*)&func);//N// //printf("=%d= ", __LINE__); if(eval_arg_p(func)) { //スタックに引き数を評価した結果を保存する(このバックグラウンドでspは--されている) //printf("eval form="); //print_s(form, ESCOFF); //printf("=%d= ", __LINE__); *sp = evallist(form->cdr, env); //printf("=%d= ", __LINE__); //off(q);//N// if(err){//N// off(q);//N// //printf("=%d= ", __LINE__); break;//N// }//N// } else { //printf("=%d= ", __LINE__); *sp = form->cdr; } // printf("\nEVAL: Current *SP is "); // print_s(*sp, ESCON); // printf("\n"); //printf("=%d= ", __LINE__); cp = apply((CELLP)func, *sp, env); //printf("=%d= ", __LINE__); off(q); }//N// sp--; break; default: //printf("\n%s%d: result=EORROR", tabs, e); //tabs[--e] = '\0'; error(ULO); } if(err == ERR) { pri_err(form); //printf("\n%s%d: result=EORROR", tabs, e); //tabs[--e] = '\0'; return NULL; } //printf("\n%s%d: result=", tabs, e); //printf("省略"); //print_s(cp, ESCON); //tabs[--e] = '\0'; //if(e == 0) printf("\n"); //printf("=%d= ", __LINE__); return cp; }
int main(void) { int i,j,n,maxi,nready; int listenfd,connfd,sockfd; struct sockaddr_in server_addr,client_addr; socklen_t client_addr_len; struct pollfd client[MAX_NUM]; char buf[BUFSIZ],str[INET_ADDRSTRLEN]; //创建一个socket listenfd = Socket(AF_INET,SOCK_STREAM,0); //端口复用 int opt = 1; setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); //绑定IP和port server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERV_PORT); inet_pton(AF_INET,SERV_IP,&server_addr.sin_addr.s_addr); Bind(listenfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); //设置最大同时建立连接数 Listen(listenfd,64); //将第一个listenfd放入到client中 client[0].fd = listenfd; client[0].events = POLLIN; for(i = 1;i < MAX_NUM;i++) client[i].fd = -1; maxi = 0; while(1) { nready = poll(client,maxi+1,-1); if(nready < 0) sys_err("poll"); if(client[0].revents & POLLIN)//有连接请求 { client_addr_len = sizeof(client_addr); connfd = Accept(listenfd,(struct sockaddr*)&client_addr,&client_addr_len); printf("client connect success,ip is %s,port is %d\n",\ inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,str,sizeof(str)),\ ntohs(client_addr.sin_port)); //将接受到的客户端通信的fd添加到client数组中 for(i = 1;i < MAX_NUM;i++) { if(client[i].fd < 0) { client[i].fd = connfd; break; } } if(i == MAX_NUM) pri_err("too many clients\n"); client[i].events = POLLIN; if(i > maxi) maxi = i; if(--nready == 0) continue; } //如果还有数据请求 for(i = 1;i <= maxi;i++) { if((sockfd = client[i].fd) < 0) continue; if(client[i].revents & POLLIN) { if((n = Read(sockfd,buf,sizeof(buf))) < 0) { if(errno == ECONNRESET) { printf("client[%d] aborted connection \n",i); Close(sockfd); sockfd = -1; }else sys_err("read"); } else if(n == 0) //客户端关闭 { printf("client[%d] closing connection \n",i); Close(sockfd); sockfd = -1; } else { //读写数据 for(j = 0;j < n;j++) buf[j] = toupper(buf[j]); write(sockfd,buf,n); printf("transfer successful data %d bytes\n",n); } if(--nready == 0) break; } } } Close(listenfd); exit(EXIT_SUCCESS); }