Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
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);
}
Exemplo n.º 6
0
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);
}
Exemplo n.º 7
0
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);
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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);
}