为什么文本文件中的全文不在服务器端打印?

时间:2014-07-15 09:48:50

标签: c file socketserver stream-socket-client

我使用以下代码将一个文本文件从客户端传输到服务器端。我在文本文件中写了一些内容,当我使用" r +"时,流被放在文本的前面。但是在服务器端,未显示全文(文件中新添加的文本和以前的文本)。服务器端仅显示已写入文件内的文本。不确定原因。我的问题是 1.为什么全文(文件中包含新文本的所有文本)都没有显示在服务器端? 2.如何显示全文?

我的服务器和客户端代码如下:(仅显示"这是我的文字"。但以前我写过文件input.txt"这是我的程序,我想显示这里写的文字!"。所以,它应该显示"这是我的文字。这是我的程序,我想显示这里写的文字!")

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <pthread.h>
#define filename "//home//Documents//Example//input.txt"

#define MAX_CLIENTS 5


//the thread function
void *new_connection_handler(void *);

int main(int argc , char *argv[])
{

    //client variables
    int sock;  
    struct sockaddr_in server;
    char buffer[256], server_reply[2000];
    int len;

    //server variables
    int socket_desc , client_sock;  
    struct sockaddr_in client;
    socklen_t c = sizeof(client);


    //check if the the command contain less than two arguments 
    if(argc != 2)
      {
          printf("use either: %s <server/client>\n", argv[0]);
      }

    // If the command contains minumum 2 arguments
     else{


    // If argv is client then execute the client code
     if(strcmp("client",argv[1]) == 0)
        {
/****************/// Client code here **********************************************************************
          //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
        /* Time to send the file */

              /******************************************************/
        FILE *pf;
        long int fsize;
        //char str[] = "This is my text.\n";

        //pf = fopen(filename, "r+");
        //fwrite(str , 1 , sizeof(str) , pf );  
          int str=malloc(2000);// update
          strcpy(str,"This is my text.\n");// update
          pf = fopen(filename, "rb");//update


        if (pf == NULL) 
           {
                printf("File not found!\n");
                return 1;
           }
        else 
           {
                printf("Found file %s\n", filename);

                fseek(pf, 0, SEEK_CUR);
                fsize = ftell(pf);
                rewind(pf);

                printf("File contains %ld bytes!\n", fsize);
                printf("Sending the file now\n");
           }

        while (1) 
           {
                int bytes_read = fread(buffer, 1, sizeof(buffer), pf);
                strcat(str,buffer);// update
                bytes_read=strlen(str);    //update  
                if (bytes_read == 0) // We're done reading from the file
                break;

                if (bytes_read < 0) 
                   {
                    error("ERROR reading from file\n"); 
               }

                while (bytes_read > 0) 
                   {
                    int bytes_written = write(sock, str, bytes_read);// update
                    printf ("bytes_read value %ld\n",bytes_written);
                    bytes_read=bytes_read-bytes_written;
                    //printf ("bytes_read value1 %ld\n",bytes_read);
                    if (bytes_written <= 0) 
                       {
                            error("ERROR writing to socket\n");
                       }

                   }    
          }       


        printf("Done Sending the File!\n");
        printf("Now Closing Connection.\n");

        /*********************************************************************************/

        close(sock);

    }

    /****************/// Server code here **********************************************************************
        // If argv is server then execute the server code
    if(strcmp("server", argv[1]) == 0 )
        {
            //Create socket
            socket_desc = socket(AF_INET , SOCK_STREAM , 0);
            if (socket_desc == -1)
              {
                printf("Could not create socket");
              }

            //Prepare the sockaddr_in structure
            server.sin_family = AF_INET;
            server.sin_addr.s_addr = INADDR_ANY;
            server.sin_port = htons( 8888 );
            bzero (&server.sin_zero, 8);

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

            //Listen
            listen(socket_desc , MAX_CLIENTS);

            //Accept and incoming connection
            printf("Waiting for incoming connections\n");

                c = sizeof(client);
            while( (client_sock = accept(socket_desc, (struct sockaddr *)&client, &c)) )
            {
                printf("Connection accepted\n");
                pthread_t thread_id;

                if( pthread_create( &thread_id , NULL ,  new_connection_handler , (void*) (intptr_t)client_sock) < 0)
                  {
                    perror("could not create thread");
                    return 1;
                  }

                printf("Handler assigned\n");
             }


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


void *new_connection_handler(void *socket_desc)
{
    //Get the socket descriptor
    int sock = (intptr_t)socket_desc;
    int read_size = 0;
    char client_message[2000];
    int len;




    //Receive a message from client
     while( (read_size = recv(sock , client_message , sizeof(client_message) , 0)) > 0 )
        printf ("Read size %d",read_size);
        printf("Read Text: %.*s", read_size, client_message);

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


    return 0;
}

1 个答案:

答案 0 :(得分:1)

您无法在文件中使用fwrite()直接编写内容,而是覆盖已存在的内容。

您拆分了操作。

使用fread()从文件中读取内容并存储在缓冲区中。

然后将缓冲区与另一个缓冲区连接起来。

char str[]="This is my text.\n";

当您与另一个字符串连接时,上述声明可能会导致分段错误。

而不是你可以在malloc()的帮助下在运行时分配内存。

str=malloc(2000);

在运行期间使用free()功能可以清除分配的内存。

然后在strcpy()的帮助下将文本复制到缓冲区。您可以在分配内存后直接分配。

strcpy(str,"This is my text.\n");

现在,您可以使用strcat()将readed缓冲区与str。

连接起来
strcat(str,buffer);

您需要找到连接字符串的长度,使用strlen()

bytes_read=strlen(str);

要访问strcat(),strcpy(),strlen(),您需要包含头文件string.h

现在将str写入socket,如:

write(sock, str, bytes_read);

如果您使用该步骤,它将正常工作。

更新:

int str=malloc(2000);

而不是使用:

char *str=malloc(2000);

strcat(str,buffer);// update            
bytes_read=strlen(str);    //update

而不是那两行在strcat函数中使用下面的行,如

if(bytes_read != 0)
{ 
    strcat(str,buffer);// update            
    bytes_read=strlen(str);    //update
}

在线程功能中将printf更改为

printf("Read Text: %s", client_message); 

如果您进行了上述更改,程序将按预期工作。