为什么不发送文件内容?

时间:2017-05-12 22:06:43

标签: c sockets networking client-server

我尝试使用TCP / IP在C中实现客户端和服务器,以便使用套接字发送消息和文件。邮件已发送但文件内容无效。我想从服务器向客户端发送文件,在客户端创建文件,但是来自服务器的文件内容不会传输到客户端。 在客户端等待消息时,如果消息包含“GET_FILE a.txt”,则服务器将文件a.txt发送到客户端,如果输入其他文本,则这是一条简单消息。 因此,如果运行客户端并键入消息“GET_FILE nameOfFile”,则服务器需要返回此文件,如果键入其他消息服务器则需要返回消息。

这是我的服务器代码:

this

这是客户端代码:

#include <stdio.h>
#include <string.h>    //strlen
#include <stdlib.h>    //strlen
#include <sys/socket.h>
#include <arpa/inet.h> //inet_addr
#include <unistd.h>    //write
#include <pthread.h> //for threading , link with lpthread

//the thread function
void *connection_handler(void *);
void *SendFileToClient(int*);

pthread_t tid;

int main(int argc , char *argv[])
{
    int socket_desc , client_sock , c , *new_sock;
    struct sockaddr_in server , client;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket");
    }
    puts("Socket created");

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

   // printf("!!!!!!!%s", server.sin_addr.s_addr);

    //Bind
    if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
    {
        //print the error message
        perror("bind failed. Error");
        return 1;
    }
    puts("bind done");

    //Listen
    listen(socket_desc , 3);

    //Accept and incoming connection
    puts("Waiting for incoming connections...");
    c = sizeof(struct sockaddr_in);


    //Accept and incoming connection
    puts("Waiting for incoming connections...");
    c = sizeof(struct sockaddr_in);
    while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) )
    {
        puts("Connection accepted");

        pthread_t sniffer_thread;
        new_sock = malloc(1);
        *new_sock = client_sock;

        if( pthread_create( &sniffer_thread , NULL ,  connection_handler , (void*) new_sock) < 0)
        {
            perror("could not create thread");
            return 1;
        }

        //Now join the thread , so that we dont terminate before the thread
        //pthread_join( sniffer_thread , NULL);
        puts("Handler assigned");
    }

    if (client_sock < 0)
    {
        perror("accept failed");
        return 1;
    }

    return 0;
}

/*
 * This will handle connection for each client
 * */
void *connection_handler(void *socket_desc)
{
    //Get the socket descriptor
    int sock = *(int*)socket_desc;
    int read_size;
    int err;
    int i = 0, j = 0;
    char *message , client_message[2000], file_name[2000];


    //Receive a message from client
    while( (read_size = recv(sock , client_message , 2000 , 0)) > 0 )
    {
        //Send the message back to client
        if(strncmp(client_message, "GET_FILE ", 8) == 0)
        {
            for(i = 9; i < strlen(client_message); i++){
                file_name[j] = client_message[i];
                j++;
            }

            err = pthread_create(&tid, NULL, &SendFileToClient, &file_name);
            if (err != 0)
                printf("\ncan't create thread :[%s]", strerror(err));


        }
        else
        {
            write(sock , client_message , strlen(client_message));
        }
    }

    if(read_size == 0)
    {
        puts("Client disconnected");
        fflush(stdout);
    }
    else if(read_size == -1)
    {
        perror("recv failed");
    }

    //Free the socket pointer
    free(socket_desc);

    return 0;
}


void* SendFileToClient(int* file_name){
            int connfd = (int)*file_name;
            printf("Connection accepted and id: %d\n",connfd);
            printf("Connected to Client: %s:%d\n", "127.0.0.1", 8888);
            //write(connfd, file_name,256);

            FILE *fp = fopen(file_name,"rb");

            if(fp==NULL)
            {
                printf("File opern error");
                return 1;   
            }   

            /* Read data from file and send it */
            while(1)
            {
                /* First read file in chunks of 256 bytes */
                unsigned char buff[1024] = {0};
                int nread = fread(buff, 1, 1024, fp);
                //printf("Bytes read %d \n", nread);        

                /* If read was success, send data. */
                if(nread > 0)
                {
                    //printf("Sending \n");
                    write(connfd, buff, nread);
                }

                if (nread < 1024)
                {
                    if (feof(fp))
                    {
                        printf("End of file\n");
                        printf("File transfer completed for id: %d\n", connfd);
                    }

                    if (ferror(fp)){
                        printf("Error reading\n");
                        break;
                    }
                }

                printf("Closing Connection for id: %d\n", connfd);
                close(connfd);
                shutdown(connfd, SHUT_WR);
                sleep(2);
            }
}

非常感谢你的帮助!

UPDATE !!!

我更新了服务器的代码,但现在我收到服务器的错误消息:“ 读错误 recv failed:错误的文件描述符 “

客户端代码相同,服务器代码现在是:

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <stdio.h> //printf
#include <string.h>    //strlen
#include <sys/socket.h>    //socket
#include <arpa/inet.h> //inet_addr

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}


int main(int argc , char *argv[])
{
    int sock;
    struct sockaddr_in server;
    char message[1000] , server_reply[2000];

    //Create socket
    sock = socket(AF_INET , SOCK_STREAM , 0);
    if (sock == -1)
    {
        printf("Could not create socket");
    }
    puts("Socket created");

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    //Connect to remote server
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        perror("connect failed. Error");
        return 1;
    }

    puts("Connected\n");

    //keep communicating with server
    while(1)
    {

        char file_name[2000];
        int i = 0, j = 0;
        printf("Enter message : ");
        //scanf("%s" , message);
        gets(message);
        //puts(message);
        //printf("%d", strncmp(message, "GET_FILE ", 9) );

        if(strncmp(message, "GET_FILE ", 8) == 0)
        {

            //Send some data
            if( send(sock , message , strlen(message) , 0) < 0)
            {
                puts("Send failed");
                return 1;
            }

            for(i = 9; i < strlen(message); i++){
                file_name[j] = message[i];
                j++;
            }

            /* Create file where data will be stored */
            FILE *fp;
            int bytesReceived = 0;
            char recvBuff[1024];
            puts(file_name);
            puts("Receiving file...");
            fp = fopen(file_name, "ab"); 
            if(NULL == fp)
            {
                printf("Error opening file");
                return 1;
            }

            long double sz = 1;

            /* Receive data in chunks of 256 bytes */
            while((bytesReceived = read(sock, recvBuff, 1024)) > 0)
            { 
                printf("%d", bytesReceived);
                sz++;
                gotoxy(0,4);
                //printf("Received: %lf Mb",(sz/1024));
                fflush(stdout);
                // recvBuff[n] = 0;
                fwrite(recvBuff, 1, bytesReceived, fp);
                // printf("%s \n", recvBuff);
            }

            if(bytesReceived < 0)
            {
                printf("\n Read Error \n");
            }
            printf("\nFile OK....Completed\n");
        }
        else
        {
            //Send some data
            if( send(sock , message , strlen(message) , 0) < 0)
            {
                puts("Send failed");
                return 1;
            }
            //Receive a reply from the server
            if( recv(sock , server_reply , 2000 , 0) < 0)
            {
                puts("recv failed");
                break;
            }

            puts("Server reply :");
            puts(server_reply);
        }
    }

    close(sock);
    return 0;
}

0 个答案:

没有答案