我使用以下代码将一个文本文件从客户端传输到服务器端。我在文本文件中写了一些内容,当我使用" 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;
}
答案 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);
如果您进行了上述更改,程序将按预期工作。