File transfer example

master
Mark Qvist 2014-05-26 19:36:41 +02:00
parent d75d1dc19f
commit 33163e2595
2 changed files with 26 additions and 7 deletions

View File

@ -10,6 +10,7 @@
#include <sys/time.h>
char *file_name;
char *final_name;
char *socket_path;
bool verbose = false;
@ -26,6 +27,8 @@ char aBuffer[HEADER_SIZE];
unsigned long fragment;
unsigned long ack;
void fail();
int main(int argc, char **argv) {
extern char *optarg;
extern int optind;
@ -58,7 +61,12 @@ int main(int argc, char **argv) {
exit(1);
} else {
socket_path = argv[argc-2];
file_name = argv[argc-1];
final_name = argv[argc-1];
size_t size = strlen(final_name)+10;
char tmp[size];
snprintf(tmp, sizeof(tmp), "%s.transfer", final_name);
file_name = malloc(size);
memcpy(file_name, tmp, size);
}
fd = fopen(file_name, "w+");
@ -71,7 +79,7 @@ int main(int argc, char **argv) {
wiSocket = socket(AF_UNIX, SOCK_STREAM, 0);
if (wiSocket == -1) {
printf("Could not create socket\n");
exit(1);
fail();
}
remote.sun_family = AF_UNIX;
@ -80,7 +88,7 @@ int main(int argc, char **argv) {
if (connect(wiSocket, (struct sockaddr*)&remote, len) == -1) {
perror("connect");
printf("Could not connect to WiPacket socket\n");
exit(1);
fail();
}
if (verbose) printf("Connected to WiPacket\n");
@ -105,7 +113,7 @@ int main(int argc, char **argv) {
int socketReady = select(wiSocket+1, &wiSocketSet, NULL, NULL, &timeout);
if (socketReady < 0) {
printf("Error reading from WiPacket while waiting for data\n");
exit(1);
fail();
}
if (socketReady == 1) {
@ -119,7 +127,7 @@ int main(int argc, char **argv) {
retries = 0;
if ((fwrite(sBuffer+HEADER_SIZE, 1, sRead - HEADER_SIZE, fd)) != sRead - HEADER_SIZE) {
printf("Error while writing received data to file\n");
exit(1);
fail();
}
}
@ -127,7 +135,7 @@ int main(int argc, char **argv) {
memcpy(aBuffer, &ack, HEADER_SIZE);
if (send(wiSocket, aBuffer, HEADER_SIZE, 0) < 0) {
printf("Error writing to WiPacket socket while sending ACK\n");
exit(1);
fail();
}
}
@ -137,7 +145,7 @@ int main(int argc, char **argv) {
memcpy(aBuffer, &ack, HEADER_SIZE);
if (send(wiSocket, aBuffer, HEADER_SIZE, 0) < 0) {
printf("Error writing to WiPacket socket while sending ACK\n");
exit(1);
fail();
}
done = true;
}
@ -151,5 +159,15 @@ int main(int argc, char **argv) {
fclose(fd);
unlink(final_name);
rename(file_name, final_name);
return 0;
}
void fail() {
fclose(fd);
unlink(file_name);
exit(1);
}

View File

@ -138,6 +138,7 @@ int main(int argc, char **argv) {
exit(1);
}
}
retries = 0;
if (verbose) printf("Got ACK for fragment %d, moving on...\n", fragment);
}