Я пытаюсь передать файл с помощью сокетов из приложения C ++ в приложение Java. Я написал этот простой код на C ++ для отправки файла:
int main() {
int sock;
struct sockaddr_in sa;
char* memblock;
/* Create socket on which to send. */
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock < 0) {
printf("opening datagram socket");
exit(1);
}
/* Construct name of socket to send to. */
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(0x7F000001);
sa.sin_port = htons(4444);
/* Send messages. */
FILE *file;
unsigned long fileLength = 0;
file = fopen(FILE_PATH, "rb");
if (!file) {
printf("Error opening the file.\n");
return 1;
}
// Get file length.
fseek(file, 0, SEEK_END);
fileLength = ftell(file);
printf("File length is: %d.\n", fileLength);
fseek(file, 0, SEEK_SET);
memblock = (char*)malloc(sizeof(char)*fileLength);
if (memblock == NULL) {fputs ("Memory error",stderr); exit(2);}
// copy the file into the buffer:
int result = fread(memblock, 1, fileLength, file);
if (result != fileLength) {fputs ("Reading error", stderr); exit(3);}
int pos = 0;
char* pMemblock = memblock;
while (pos < fileLength) {
int sent = sendto(sock, pMemblock, 80, 0, (struct sockaddr*)&sa, sizeof sa);
if (sent < 0)
printf("Error sending datagram message.\n");
else printf("Sent %d.\n", sent);
pos += 80;
pMemblock += 80;
}
delete memblock;
fclose(file);
close(sock);
return 0;
}
На стороне Java я записываю полученные данные:
while (true) {
receiveData = new byte[300];
receivedPacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivedPacket);
try {
fou = new FileOutputStream(<filename>, true);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
fou.write(receivedPacket.getData(), 0, 80);
fou.close();
}
В результате получается, что файл, который я получаю, верен до определенного момента, но не является полным. Что-то не так в моем коде в Java или в части C ++?
Спасибо!