Exemple #1
0
int main(int argc , char *argv[]) {
	int socket_desc, client_sock, c;
	struct sockaddr_in server, client;
	 
	socket_desc =   socket(AF_INET,    SOCK_STREAM ,   0);
	if (socket_desc == -1)
	{
		printf("Could not create socket");
		exit(1);
	}
	puts("Socket created");
	 
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	server.sin_port=htons((ushort) 3000);
	 
	//Bind
	if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
	{
		//print the error message
		perror("bind failed. Error");
		exit(1);
	}
	puts("bind done");
	 
	//Listen
	listen(socket_desc , 5);
	//Print address
	printIPAddress();
	//Accept and incoming connection
	puts("Waiting for incoming connections...");
	c = sizeof(struct sockaddr_in);
	 
	pthread_t thread_id;
	
	while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
	{
		puts("Connection accepted");
		
		if( pthread_create( &thread_id , NULL ,  connection_handler , (void*) &client_sock) < 0)
		{
			perror("could not create thread");
			exit(1);
		}
		
		puts("Handler assigned");
	}
	 
	if (client_sock < 0)
	{
		perror("accept failed");
		exit(1);
	}
}
Exemple #2
0
/**
 * Prints interface information for the interface ifa
 */
void printInterfaceInfo(struct ifaddrs *ifa){
	// create a puppet socket to act as a file descriptor for ioctl()
	// I can create it here, since I can reuse it
	int fd=socket(AF_INET,SOCK_DGRAM,0);

	// create the ifr & ifm
	// ifr is more general and more stuff can be retrieved, while
	// ifm is purely for media information
	struct ifreq ifr;
	struct ifmediareq ifm;

	size_t if_name_len=strlen(ifa->ifa_name);
	// ensure the interface name is not too long, since  ifr_name is fixed length buffer
	if (if_name_len < sizeof(ifr.ifr_name) && if_name_len < sizeof(ifm.ifm_name) ) {
		// set name for IFR
		memcpy(ifr.ifr_name, ifa->ifa_name, if_name_len);
		ifr.ifr_name[if_name_len]=0;

		// set name for IFM
		memcpy(ifm.ifm_name, ifa->ifa_name, if_name_len);
		ifm.ifm_name[if_name_len]=0;
	} else {
		puts("Interface name is too long");
		exit(1);
	}

	//output current interface
	printf("Interface: %s", ifa->ifa_name);

	if (fd==-1) {
		puts("Socket could not be created");
		exit(1);
	}

	// print flags
	printHeader("Flags", &printFlags, ifa->ifa_flags);
	// prints the MTU
	if (ioctl(fd, SIOCGIFMTU, &ifr) != -1)
			printf("\tMTU: %d", ifr.ifr_metric);

	// prints the options
	if (ioctl(fd, SIOCGIFCAP, &ifr) != -1)
		printHeader("Options", &printCapabilities, ifr.ifr_curcap);

	// prints the MAC address
	if(ifa->ifa_addr->sa_family == AF_LINK){
		struct sockaddr_dl *mac_addr = (struct sockaddr_dl *)ifa->ifa_addr;
		unsigned char mac[6];
		// check if he address length is 6 bytes
		if (6 == mac_addr->sdl_alen) {
		  memcpy(mac, LLADDR(mac_addr), mac_addr->sdl_alen);
		  printf("\tMAC Address: %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
		}
	}

	// print status
	if (ioctl(fd, SIOCGIFMEDIA, &ifm) != -1)
				printf("\tStatus:%s\n", ifm.ifm_status == 3 ? "Active" : ifm.ifm_status == 1 ?
						"Inactive" : "Unknown"); // 3 is active and 1 is inactive

	/**
	 * I'm not going to handle media because it has way too many flags to implement
	 * in a timely manner
	 */

	// IP
	printIPAddress("IP", IP_ADDR, fd, ifr);

	// Point to point
	printIPAddress("Point-to-Point", P2P_ADDR, fd, ifr);

	// broadcast
	printIPAddress("Broadcast", BCAST_ADDR, fd, ifr);

	//netmask
	printIPAddress("Netmask", MASK_ADDR, fd, ifr);

	//autoconf
	printIPAddress("Autoconf", AUTOCONF_ADDR, fd, ifr);

	//autoconf mask
	printIPAddress("Autoconf mask", AUTOCONF_MASK, fd, ifr);

	//ipv4all
	printIPAddress("IPv4All", IPV4ALL_ADDR, fd, ifr);

	//link level
	printIPAddress("Link level", LINK_LEVEL_ADDR, fd, ifr);

	close(fd);
}
int main(int argc, char *argv[]){
	int 	listenfd,
			i=0, 
			iPort,
			fd,
			err,
			status;
	char 	client[MAX_CANON],
			command[MAX_CANON],
			ip[IP_MAX],
			*saveptr,
			*sPort,
			*sIp,
			a,
			*c;
	struct 	dirent *direntp;
	DIR 	*dirp;
	struct	sigaction sigIntHandler;
	struct ifaddrs *myaddrs, *ifa;
	request_t request, request2;
	flag_t 	flag;
	sigset_t set;
	sigemptyset(&set);
	sigaddset(&set, SIGINT);

	sigIntHandler.sa_handler = signalHandler;

	if(argc != 2)
		usage("2 arguman girmelisiniz\t./client <server IP>:<server port number>");

	else{
		if (sigemptyset(&sigIntHandler.sa_mask) == -1 || sigaction(SIGINT, &sigIntHandler, NULL) || sigaction(SIGUSR1, &sigIntHandler, NULL))
			err_sys("signal handler");
		sigIntHandler.sa_flags = 0;
		saveptr=command;
		sIp=strtok_r(argv[1], ":", &saveptr);
		sPort=strtok_r(NULL, ":", &saveptr);
		printf("%s\n", argv[1]);
		if(sPort!=NULL)
			iPort=atoi(sPort);
		else
			usage("./client <server IP>:<server port number>");

		socketFD = callSocket(sIp, iPort);
		if(socketFD==-1)
			err_sys("connection error");

		getcwd(request2.path, PATH_MAX);

		if(write(socketFD, &request2, sizeof(request2))<0)
			err_sys("write");

		if(read(socketFD, &id, sizeof(int))<0)
			err_sys("read");

		pthread_mutex_init(&mutex, NULL);
		if (err = pthread_create(&tid, NULL, (void *)readFromServer, &c)<0)
			perror("pthread_create");

		status = getifaddrs(&myaddrs);
		if (status != 0)
			err_sys("getifaddrs failed!");

		freeifaddrs(myaddrs);

		system("clear");
		printf("Port Number: %d ",iPort);
		for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next)
			if ((ifa->ifa_flags & IFF_UP) != 0 && NULL != ifa->ifa_addr)
				printIPAddress(ifa);
	
		fprintf(stderr, "\nPlease enter a command.\nEnter 'help' for display the available commands and their usage.\n");

		while(1){
			printf("\nClient ID: %d\n  >\t", id);

		 	fgets(command, 50, stdin);
		 	printf("\n");
		 	command[strlen(command)-1]='\0';

		 	if(strcmp(command, "help") == 0)
		 		menu();
		 	else if(strcmp(command,"listLocal") == 0){
		 		char cwd[255];
		 		getcwd(cwd, 255);
				if((dirp = opendir(cwd)) == NULL)
					err_sys("opendir");

				printf("List of local files in %s\n", cwd);
				while((direntp = readdir(dirp)) != NULL) {
					if(strcmp(direntp->d_name,".") != 0 && strcmp(direntp->d_name,"..") != 0){
						fprintf(stderr, "%s\n", direntp->d_name);
					}
				}
		 	}

		 	else if(strcmp(command,"lsClients") == 0){
				sprintf(request.command, "%s", "lsClients");
				if(write(socketFD, &request, sizeof(request))<0)
					perror("write");
		 	}

		 	else if(strncmp(command,"sendFile", 8) == 0){
		 		bool status=true;
				char *fileName, *id1, *saveptr;
				saveptr=command;
				strtok_r(command, " ", &saveptr);

				fileName = strtok_r(NULL, " " , &saveptr);
				id1 = strtok_r(NULL, " ", &saveptr);

					if(fileName==NULL){
						fprintf(stderr, "Please enter a current filename.\n");
						status=false;
					}
					else{
						sprintf(request.file.name, "%s", fileName);
						if((fd = open(fileName, O_RDONLY))<0){
							fprintf(stderr, "%s isn't a current file name. Try again!\n", fileName);
							request.status=-3;
							status=false;
						}
					}
					if(id1==NULL) {	/*dosyayi sadece server'a yolla. */
						request.status=-1;
						request.clientID=id;
						printf("nULL\n");
						if((fd = open(fileName, O_RDONLY))<0){
							fprintf(stderr, "%s isn't a current file name. Try again!\n", fileName);
							status=false;
							printf("Status: %d\n", status);
						}
					}
					else{
						request.status=1;
						request.clientID=atoi(id1);
					}

					struct stat st;
					stat(fileName, &st);
					request.file.size = st.st_size;
							
					strcpy(request.command,"sendFile");
					if(status){
						flagWrite=1;
						pthread_sigmask(SIG_BLOCK, &set, NULL);
						if(write(socketFD, &request, sizeof(request))<0)
							err_sys("write");
						else{
							int j=0;
							while(j<request.file.size){
								if(read(fd, &a, sizeof(char))<0)
									perror("read1");
								write(socketFD, &a, sizeof(char));
								++j;
							}
							close(fd);
						flagWrite=0;
						pthread_sigmask(SIG_UNBLOCK, &set, NULL);
					}
				}
			}
			else if(strcmp(command,"listServer") == 0){
				sprintf(request.command, "%s", "listServer");
				if(write(socketFD, &request, sizeof(request))<0)
					perror("write");
			}
			
			else
				fprintf(stderr, "Please enter a current command.\n");
		}
	}
}