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); } }
/** * 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"); } } }