В настоящее время я работаю над базовой программой отправки и получения, используя UDP в c. В настоящее время он отправляет файл полуправильно, единственная проблема заключается в том, что он теряет первый символ каждого фрагмента отправленных данных. Например, если бы я отправил декларацию независимости, начало первой отправки чанка выглядело бы так:
"^ @ N КОНГРЕСС, 4 июля 1776 г." в отличие от «IN CONGRESS, 4 июля 1776 года».
Начало каждого чанка, полученного и добавленного в файл, начинается с «^ @», а не с правильной буквы. Я попытался распечатать recvData [0], и он печатается как много пробелов (по крайней мере, 100 новых строк).
Кроме того, эта программа работает на 100% нормально на моем локальном хосте (OS X), но при загрузке на сервер (Ubuntu) она заменяет первый символ на ^ @, так что я совершенно не понимаю, в чем проблема есть.
Вот мой исходный код для функции отправки:
void sendFile() {
// Announce who we're sending data to
if(DEBUG) { printf("\nSending %s to %s:%d\n", filename, address, port); }
// Open file
FILE * file = fopen(filename, "rb");
if (file == NULL) {
perror("Invalid File\n");
exit(1);
}
// Get size of the file
fseek(file, 0, SEEK_END);
int filesize = ftell(file);
rewind(file);
int curPos = 0;
int dataSize = 0;
while(curPos < filesize) {
struct sockaddr_in server_addr;
struct hostent *recvr;
char sendData[BUFSIZE]; // stores message to be sent
memset(sendData, 0, BUFSIZE);
int byte, i;
for(i = 0; i < BUFSIZE; i++){
if((filesize - curPos) > 0) {
byte = fgetc(file);
sendData[i] = byte;
curPos++;
dataSize++;
}
else { break; }
}
recvr = gethostbyname(address);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *) recvr->h_addr);
bzero(&(server_addr.sin_zero), 8);
if(DEBUG) {
char tempData[1201];
strncpy(tempData, sendData, 1200);
tempData[1201] ='\0';
printf("%s\n\n\n\n\n", tempData);
}
sendto(sock, sendData, dataSize, 0,
(struct sockaddr *) &server_addr, sizeof (struct sockaddr));
dataSize = 0;
}
fclose(file);}
Вот мой исходный код для функции приема:
void receiveFile() {
int addr_len, bytesRead;
char recvData[BUFSIZE]; // Buffer to store received data
struct sockaddr_in client_addr;
addr_len = sizeof (struct sockaddr);
printf("\nWaiting for data on port %d\n", port);
//Keep reading data from the socket
while (1) {
FILE *fp;
fp=fopen("dummyfile.txt", "ab");
memset(recvData, 0, BUFSIZE);
bytesRead = recvfrom(sock, recvData, BUFSIZE, 0,
(struct sockaddr *) &client_addr, &addr_len);
if(DEBUG) {
printf("%c\n", recvData[0]);
}
int x;
for(x = 0; x < bytesRead; x++) {
fputc(recvData[x], fp);
}
// Print out who we're receiving from and what we're recieving
printf("Receiving data from %s : %d\n", inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
fclose(fp);
}}