これは私の大学のプロジェクトであり、変数の使用効率は大きな問題ではありません。プログラムはUnix環境でソケットネットワークプログラミングをベースにした「 FTP - ファイル転送」!このプログラムは、 1 つのサービスにのみ応答します。
このプログラムを使用すると、クライアントからサーバーにファイルをダウンロードしたり、サーバーからクライアントにダウンロードしたりできます。私のコードは検証を使用してアップライトで動作していますが、実行のたびにサーバーを再起動するのは無意味であるため、サーバーの実行を無限にループしようとすると問題が発生します!
論理エラーが発生した場所を教えてもらえますか?
サーバ側:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<errno.h>
#include<unistd.h>
int sockfd,newsockfd,portno,clien;
char buffer[256] = { '\0' };
struct sockaddr_in serv_addr,cli_addr;
int n;
int download();
void upload();
void server_files();
void authentication();
int main(int argc, char *argv[])
{
if(argc<2)
{
fprintf(stderr,"Error, No port provided\n");
exit(1);
}
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("Error opening socket\n");
exit(1);
}
bzero((char *) &serv_addr, sizeof(serv_addr));//zeroing the sturture
portno =atoi(argv[1]);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(portno);
if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) <0 )
{
printf("Error on binding\n");
exit(1);
}
int optval;
setsockopt(100,sockfd, SO_REUSEADDR, &optval, sizeof optval);
listen(sockfd,5);
clien = sizeof(cli_addr);
while(1)
{
newsockfd=accept(sockfd, (struct sockaddr *) &cli_addr, &clien );
if(newsockfd <0)
{
printf("Error on accept\n");
exit(1);
}
//Authentication
char auth[2];
read(newsockfd,auth,2);
int x = atoi(auth);
if(x==0)
{
char user[20]={ '\0' } ;
char pass[20]={ '\0' } ;
read(newsockfd,user,20);
usleep(1000);
read(newsockfd,pass,20);
if((strcmp(pass,"123") != 0) && (strcmp(user, "tuhin") != 0))
{
char auth[2]="1";
write(newsockfd,auth,2);
close(newsockfd);
exit(0);
}else{
char auth[2]="0";
write(newsockfd,auth,2);
}
}
//End OF Authentication
//Server NAME
char S_name[15]="ftp_C-project.";
usleep(1000);
write(newsockfd,S_name,15);
//check Id from client
system("clear");
char id[2];
read(newsockfd,id,2);
int ch = atoi(id);
switch(ch)
{
case 1:download();
break;
case 2:upload();
break;
case 3:server_files();
break;
case 4:printf("\nDisplayed file contents of Client\n\n");
break;
default:printf("Invalid\n");
}
}//END OF WHILE(1)
return 0;
}
int download()
{
char buffer[256] = {'\0'};
n=read(newsockfd,buffer,256);
if(n<0){
printf("Error reading from socket\n");
exit(1);
}
n=access(buffer,F_OK); // Check for validation of file
switch(n)
{
case 0:
{
//sends value 0 to char error of client, "File present"
char id[2]="0";
write(newsockfd,id,2);
printf("Client connected successfully\n");
printf("\nFile requested by the client : %s \n\n", buffer);
char buf[256] = {'\0'};
FILE *fp;
fp = fopen(buffer, "r");
if(fp == NULL)
{
printf("fopen failed : %s \n", strerror(errno));
return -1;
}else
{
printf("Open of file \"%s\" is successful \n", buffer);
}
while(fgets(buf, sizeof(buf), fp) != NULL)
{
//printf("printing line from the file : %s \n", buf);
write(newsockfd, buf, sizeof(buf));
}
printf("\nFile Transfer Completed.\n");
}
case-1:
{
char id[2]="-1";
write(newsockfd,id,2);
printf("Download process terminated.\n");
}
}
}
void upload()
{
char buffer[256] = {'\0'};
// error will store -1 || 0
char error[256];
read(newsockfd, error, 256);
int ch =atoi(error);
if(ch==0)
{
n=read(newsockfd,buffer,256);
if(n<0){
printf("Error reading from socket\n");
exit(1);
}
char mybuf[256];
FILE *fp = fopen(buffer, "a+");
while(1)
{
n = read(newsockfd, mybuf, sizeof(mybuf));
if (n <= 0)
break;
fputs(mybuf, fp);
}
printf("\nFile requested by the client to upload: %s \n", buffer);
printf("\nUpload Complete\n");
}
else
printf("Upload process terminated.\n");
}
void server_files()
{
char buffer[256] = {'\0'};
system("ls -l>_");
char buf[256] = {'\0'};
FILE *fp = fopen("_", "r");
while(fgets(buf, sizeof(buf), fp) != NULL)
{
write(newsockfd, buf, sizeof(buf));
}
system("rm _");
printf("\nSent file contents of the Server to Client\n");
}
クライアント側:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
void client_files();
void server_files();
void download();
int upload();
int sockfd,portno,n,q;
char buffer[256] = {'\0'};
struct sockaddr_in serv_addr;
struct hostent *server;
int main(int argc, char *argv[])
{
if(argc<3)
{
fprintf(stderr,"Usage %s hostname port\n",argv[0]);
exit(1);
}
portno = atoi(argv[2]);
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
printf("Error opening socket\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));//zeroing the sturture
server=gethostbyname(argv[1]);
if(server==NULL){
fprintf(stderr,"Error, no such host\n");
exit(0);
}
serv_addr.sin_family=AF_INET;
bcopy((char *)server->h_addr,(char *)&serv_addr.sin_addr.s_addr,server->h_length);
serv_addr.sin_port=htons(portno);
if(connect(sockfd, (struct sockaddr*) &serv_addr,sizeof(serv_addr)) <0 )
{
printf("Error Connecting\n");
exit(0);
}
//Authentication
system("clear");
char id[2]="0";
write(sockfd,id,strlen(id));
char usr[20]={ '\0' } ;
char pwsd[20]={ '\0' } ;
char auth[256]={ '\0' } ;
system("clear");
printf("Authentication!\n");
printf("User :");
scanf("%s",usr);
write(sockfd,usr,strlen(usr));
char *pswd =getpass("#");
write(sockfd,pwsd,20);
usleep(1000);
read(sockfd,auth,2);
int x=atoi(auth);
if(x)
{
printf("Access Denied!\nWrong Credentials.\n");
close(sockfd);
exit(0);
}
//End OF Authentication
//Fetch name of Server
char S_name[15];
system("clear");
read(sockfd,S_name,15);
sleep(1);
printf("Server Name: %s\n",S_name);
sleep(1);
printf("\n>>>>Access Granted<<<<\n");
sleep(1);
printf("1.Download\n2.Upload\n");
printf("3.List files (Server)\n4.List files (Client)\n");
int ch;
scanf("%d",&ch);
switch(ch){
case 1:download();
break;
case 2:upload();
break;
case 3:server_files();
break;
case 4:client_files();
break;
default:
printf("Invalid Input\n");
}
return 0;
}
void download()
{
char buffer[256] = {'\0'};
char id[2]="1";
write(sockfd,id,strlen(id));
printf("Enter the filename to download from the server:");
scanf("%s", buffer);
n=write(sockfd,buffer,strlen(buffer));
if(n<0){
printf("Error writing to socket\n");
exit(0);
}
// error will store -1 || 0
char error[256];
read(sockfd, error, 256);
int ch =atoi(error);
switch(ch)
{
case 0://If file present on server
{
printf("Download Initialized \n");
char mybuf[256];
FILE *fp = fopen(buffer, "a+");
while(1)
{
n = read(sockfd, mybuf, sizeof(mybuf));
if (n <= 0)
break;
// printf("buf : %s \n", mybuf);
fputs(mybuf, fp);
}
sleep(1);
printf("\nDownload Completed \n\n");
break;
}
case-1://If file not present on server
printf("\nFile \"%s\" not found.\n",buffer);
printf("Download process terminated.\n");
break;
}
}
int upload(){
char buffer[256] = {'\0'};
char id[2]="2";
write(sockfd,id,strlen(id));
printf("Enter the filename to upload to the server:");
scanf("%s", buffer);
n=access(buffer,F_OK);
switch(n)
{
case 0:
{
char id[2]="0";
write(sockfd,id,2);
usleep(5000);
n=write(sockfd,buffer,strlen(buffer));
usleep(5000);
if(n<0){
printf("Error writing to socket\n");
exit(0);
}
printf("Upload Initialized \n");
char mybuf[256];
memset(mybuf, '\0', sizeof(mybuf));
FILE *fp = fopen(buffer, "r");
if(fp == NULL)
{
printf("fopen failed : %s \n", strerror(errno));
return -1;
}
else
{
printf("Open of file \"%s\" is successful \n", buffer);
}
while(fgets(mybuf, sizeof(mybuf), fp) != NULL)
{
//printf("printing line from the file : %s \n", mybuf);
write(sockfd, mybuf, sizeof(mybuf));
}
printf("\nFile Transfer Completed.\n");
break;
}
case-1:
{
char id[2]="-1";
write(sockfd,id,2);
printf("\nFile \"%s\" not found.\n",buffer);
printf("Upload process terminated.\n");
break;
}
}
}
void server_files(){
char buffer[256] = {'\0'};
char id[2]="3";
write(sockfd,id,strlen(id));
int x=0;
char mybuf[256];
while(1)
{
n = read(sockfd, mybuf, sizeof(mybuf));
if (n <= 0)
break;
if(x!=1){
printf(" %s ", mybuf);
}
x++;
}
}
void client_files(){
char buffer[256] = {'\0'};
char id[2]="4";
write(sockfd,id,strlen(id));
system("ls -l");
}