如何将文本文件从C发送到Java并从Java到C接收相同的文件,而不会丢失数据?代码如下以供参考。
#include <time.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/socket.h>
int send_text(int socket) {
FILE *text;
char a[50];
int size, read_size, stat, packet_index;
char send_buffer[8008], read_buffer[8008];
int wrt=0,sock_fd,tsize=0;
packet_index = 1;
int i=0;
text = fopen("/home/sosdt009/Desktop/character3.txt", "r");
if (text == NULL) {
printf("Error Opening text File:");
exit(-1);
}
printf("Getting text Size:\n");
gets(a);
fseek(text, 0, SEEK_END);
size = ftell(text);
fseek(text, 0, SEEK_SET);
printf("Total text size: %d \n", size);
gets(a);
//Send text Size
printf("Sending text Size:\n",size);
gets(a);
send(socket, (void *)&size, sizeof(size), 0);
/*do {
stat = recv(socket, read_buffer, 1024, 0);
}*/while(stat < 0)
printf("Socket data:%s \n", read_buffer);
gets(a);
while(size>tsize) {
//Read from the file into our send buffer
read_size = fread(send_buffer,1,sizeof(send_buffer),text);
printf("The size of send buffer:%c \n",send_buffer);
gets(a);
printf("The read size value is :%d \n", read_size);
gets(a);
//Send data through our socket
do
{
stat = send(socket, send_buffer, read_size, 0);
printf("The send size value is: %d \n", size);
gets(a);
printf("The read size value is: %d \n", read_size);
gets(a);
} while (stat < 0);
printf("Packet %d, sent %d bytes.\n", packet_index, read_size);
gets(a);
//packet_index++;
//Zero out our send buffer
tsize = tsize+read_size;
printf("The tsize value is:%d \n",tsize);
gets(a);
memset(send_buffer,0, sizeof(send_buffer));
if(read_size<=NULL)
{
printf("The connection is transferred to received text: \n");
gets(a);
}
}
fclose(text);
//close(socket);
printf("Text successfully send:\n");
gets(a);
return 0;
}
int receive_text(int socket)
{
int buffersize = 77,recv_size=0,read_size = 1, write_size,size;
char *pBuf,a[50],b[77];
int errnom,i;
FILE *textnew;
size_t rec;
textnew = fopen("/home/sosdt009/Desktop/receivednew.txt", "a");
if (textnew == NULL)
{
printf("Error has occurred, text file could not be opened \n");
return -1;
}
//Loop while we have not received the entire file yet
while(read_size > 0)
{
ioctl(socket, FIONREAD, &buffersize);
printf("The Buffersize is :%d\n",buffersize);
gets(a);
printf("The size of socket is:%d\n",socket);
gets(a);
//We check to see if there is data to be read from the socket
if (buffersize > 0)
{
printf("Buffersize value is :%d\n", buffersize);
gets(a);
pBuf = malloc(buffersize);
if (!pBuf)
{
printf(errnom, "Memory Error Cannot Allocate!\n");
gets(a);
exit(-1);
}
//read_size = read(socket,pBuf,buffersize);
//read_size = fread(pBuf,buffersize,1,textnew);
read_size = recv(socket,pBuf,sizeof(pBuf),1);
//memset(pBuf,'\0',sizeof(pBuf));
printf("Read size value is :%d \n",read_size);
gets(a);
printf("Buffersize value is:%d \n",sizeof(pBuf));
gets(a);
/*if (read_size < 0)
{
printf("%d\n",strerror(errno));
printf("Data not written to the file:\n");
gets(a);
goto free;
}*/
//Write the currently read data into our text file
//write_size = write(textnew,read_size,pBuf); //using write function
write_size = fwrite(pBuf,1,read_size,textnew);
free(pBuf);
printf("Write size value is :%d \n",write_size);
gets(a);
printf("Buffer size value is :%d \n",sizeof(pBuf));
gets(a);
//Increment the total number of bytes read
recv_size += read_size;
printf("Received size value is:%d \n",recv_size);
gets(a);
printf("Read size value is :%d \n",read_size);
gets(a);
}
}
free:
fclose(textnew);
close(socket);
printf("Text Successfully Received:\n");
gets(a);
return 0;
}
int main(int argc,char *argv[])
{
int socket_desc;
struct sockaddr_in server;
char *parray,errnomu;
//Create socket
socket_desc = socket(AF_INET,SOCK_STREAM,0);
if(socket_desc == -1)
{
printf("Could not create socket \n");
}
memset(&server,0,sizeof(server));
server.sin_addr.s_addr = inet_addr("10.170.0.38");
server.sin_family = AF_INET;
server.sin_port = htons(6999);
//Connect to remote server
if (connect(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
printf(strerror(errnomu));
printf("Connect Error \n");
return -1;
}
puts("Connected");
send_text(socket_desc);
receive_text(socket_desc);
close(socket_desc);
return 0;
}
答案 0 :(得分:0)
你正在吃这顿饭。你不需要所有的fseeks和ftells以及do / whiles和嵌套循环。 do / while特别疯狂。在出错时继续做某事?
我建议您不要使用stdio来读取文件。它在这里没有增加任何价值,只会让代码变得比它需要的更复杂。
在C中复制文件描述符的标准方法如下:
while ((count = read(infd, buffer, sizeof buffer)) > 0)
{
write(outfd, buffer, count);
}
if (count == -1)
{
perror("read");
}
// close them both
如果这是C编码的公平样本,则无法与朋友分享您对Java代码的信心。
标准Java拷贝循环如下:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
// close them both