2015-12-10 3 views
0

Итак, у меня есть server.c и client.c Клиент.c запросит ввести имя файла, а затем отправить имя файла на сервер и проверить, существует ли файл, если да, отправьте этот файл клиенту. Моя проблема заключается в том, что когда сервер получает правильное имя файла и отправляет его клиенту, клиент не может получить файл.Socket send and get txt file c

вот server.c

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<unistd.h>  
#include<arpa/inet.h> 
#include<sys/socket.h> 
#include<pthread.h> 

#define PORT 5000 

void *multiconnection(void *); 

int main(int argc , char *argv[]) 
{ 
int s_sock , c_sock; 
int sin_size; 
int *addSocket; 
struct sockaddr_in server; 
struct sockaddr_in client; 

/* initial */ 
s_sock = socket(AF_INET , SOCK_STREAM , 0); 
if (s_sock < 0) 
{ 
    perror("socket cannot be created"); 
} 
printf("Socket is successfully created\n"); 

/* Fill the socket address struct */ 
server.sin_family = AF_INET; 
server.sin_port = htons(PORT); 
server.sin_addr.s_addr = INADDR_ANY; 

/* Bind a special Port */ 
if(bind(s_sock,(struct sockaddr *)&server, sizeof(server)) < 0) 
{ 
    perror("binding Error"); 
    exit(1); 
} 
printf("binding success\n"); 

/* Listen to connect */ 
listen(s_sock , 3); 

/* Accept connections */ 
printf("Waiting clients connections:::\n"); 

sin_size = sizeof(struct sockaddr_in); 
while((c_sock = accept(s_sock, (struct sockaddr *)&client, (socklen_t*)&sin_size))) 
{ 
    /* create new sockets for mulitiple clients */ 
    pthread_t sniffer_thread; 
    addSocket = malloc(1); 
    *addSocket = c_sock; 

    if(pthread_create(&sniffer_thread,NULL, multiconnection,(void*) addSocket) < 0) 
    { 
     perror("Threads error"); 
     exit(1); 
    } 
} 

if (c_sock < 0) 
{ 
    perror("accept failed"); 
    exit(1); 
} 

return 0; 
} 


void *multiconnection(void *s_sock) 
{ 
/* Get the socket descriptor */ 
int sock = *(int*)s_sock; 
int read; 
char *msg , c_msg[2000]; 

/* Receive a message from client */ 
while(read = recv(sock , c_msg , sizeof(c_msg) , 0) > 0) 
{ 
printf("Recieve file name from client: %s\n", c_msg); 
if (fopen(c_msg,"r") == NULL) 
    write(sock , "File does not exsit" , 20); 
else 
{ 
    write(sock ,"File exsit", 20); 
    /* if file exsit, send to clients */ 
     char* file_pth = "/home/nelson/Desktop/SYSPROG_asg_04A_Tang/hello.txt"; 
    char buff[1024]; 
     printf("Sending %s to the Client...\n", file_pth); 
    FILE *fp = fopen(file_pth, "r"); 
    if(fp == NULL) 
     { 
     perror("Open file error"); 
    exit(1); 
    } 

    int file_size; 
    while(file_size = fread(buff, sizeof(char), sizeof(buff), fp) > 0) 
    { 
    if(send(sock, buff, file_size, 0) < 0) 
    { 
     perror("Fail to send file"); 
     exit(1); 
    } 
    printf("Buff : %s",buff); 
    } 
     write(sock , "You Recieved the file" , 50); 
    printf("file is sent to client!\n"); 
     //close(sock); 
} 
} 

if(read < 0) 
    perror("fail to recieve"); 


free(s_sock); 

return 0; 
} 

Вот мой client.c, теперь я просто пытаюсь получить содержимое из текстового файла, но он не может.

#include<stdio.h> 
#include<sys/socket.h>  
#include<arpa/inet.h> 
#include<string.h> 

#define PORT 5000 
#define localAddr "127.0.0.1" 
int main(int argc , char *argv[]) 
{ 
int s_sock; 
char msg[512]; 
char reply_msg[512]; 
char buff[512]; 
struct sockaddr_in server; 

/* initial */ 
s_sock = socket(AF_INET , SOCK_STREAM , 0); 

if (s_sock < 0) 
{ 
    perror("socket cannot be created"); 
} 
printf("Socket is successfully created\n"); 

/* Fill the socket address struct */ 
server.sin_family = AF_INET; 
server.sin_port = htons(PORT); 
server.sin_addr.s_addr = inet_addr(localAddr); 

/* Connect to server */ 

if (connect(s_sock,(struct sockaddr *)&server, sizeof(server)) < 0) 
{ 
    perror("connection error"); 
    //exit(1); 
} 

printf("Connected\n"); 

while(1) 
{ 
    printf("Enter file name you wish to get from server: "); 
    scanf("%s" , msg); 

    /* send file name */ 
    if(send(s_sock,msg,sizeof(msg),0) < 0) 
    { 
     perror("Sending error"); 
     //exit(1); 
    } 

    /* Receive message from sever */ 
    if(recv(s_sock,reply_msg , 512 , 0) < 0) 
    { 
     perror("Receive message error"); 
     //exit(1); 
    } 

    printf("Server reply : %s\n",reply_msg); 


    /* Receive a file */ 
if (strcmp(reply_msg,"File exsit") == 0) 
    { 
    //memset(reply_msg, 0, sizeof(reply_msg)); 
     printf("Receiving file from Server\n"); 
    char* file_path = "/home/nelson/Desktop/SYSPROG_asg_04A_Tang/final.txt"; 
    FILE *fp = fopen(file_path, "a"); 

    if(fp == NULL) 
    printf("File %s Cannot be opened.\n", file_path); 

    char buff[512]; 
    //recv(s_sock,buff , sizeof(buff) , 0); 
     printf("buff : %s\n", buff); 
    printf("buff : %s\n", reply_msg); 
    /*int w_size = fwrite(reply_msg, sizeof(char), sizeof(reply_msg), fp); 
    if(w_size < sizeof(reply_msg)) 
    { 
     perror("Writing error.\n"); 
    } 

    if (sizeof(reply_msg) == 0 || sizeof(reply_msg) != 512) 
    { 
     break; 
    } 
    if(sizeof(reply_msg) < 0) 
     { 
     perror("error"); 
    } 
    printf("Ok received from server!\n"); 
    fclose(fp);  */ 
    }else 
    printf("\n"); 
    } 

close(s_sock); 
return 0; 
} 
+1

Что вы имеете в виду: «* клиент не может получить файл *», пожалуйста, быть конкретный. Вы пишете весь код, или вы взяли его часть от кого-то еще? Я прошу, потому что в вашем коде нет четкого стиля кодирования, поэтому кажется, что на нем работает более одного человека. –

+1

По крайней мере, некоторые из обычных подозреваемых: 'printf («Получить имя файла от клиента:% s \ n», c_msg); : вызов printf («% s .....» в буфере, который не гарантирован NULL-завершен. Невозможно правильно и полностью обрабатывать результаты системных вызовов, особенно recv(). Предполагая, что поток TCP может передавать сообщения дольше чем один байт без протокола сверху. Предполагая, что recv() всегда загружает количество байтов, запрошенных его аргументами в буфер. –

+0

'addSocket = malloc (1);' не выделяет достаточно места для int fd 'c_sock' . –

ответ

0

Моя проблема заключается в том, что когда сервер получить правильное имя файла и отправить клиенту, клиент не может получить файл.

Основной причиной этой проблемы является, конечно, что вы закомментировал recv() вызова в клиенте:

//recv(s_sock,buff , sizeof(buff) , 0);