PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateien über Bluetooth



winstonsmith
18-01-2005, 22:19
Hallo,

ich versuch über 2 Bluetooth-Sticks eine Datei zu verschicken.
Das läuft, wie unten in den Listings zu sehen, alles über Sockets.
Mein Problem ist nun, das der Server zwar alle Pakete der Datei wegschickt, der Client aber nicht alle empfängt.
Die Verbindung ist in Ordnung, das hab' ich überprüft. Daran kann's/sollte es nicht liegen.

Ich ärgere mich schon seit Tagen mit dem Programm herum.
Vielleicht seh' ich aber auch den Wald vor lauter Bäumen nicht.

Hat von euch vielleicht eine/r eine Idee?

hier die Listings: Der Server



#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <netdb.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/sco.h>



struct sockaddr_sco loc_addr, rem_addr;

/* Default data size */
long data_size = 672;

unsigned char *buf;
bdaddr_t bdaddr;
bdaddr_t ba;


int send_mode(int s)
{
struct timeval time;
char *filename="/home/Winston/bt/bt-client.c"; //Filename
int fd; //File-Descriptor
int rlen;
mode_t filemode= O_RDONLY; //File-Mode to open
struct sco_options so;
uint32_t seq;
int opt;
opt = sizeof(so);
if (getsockopt(s, SOL_SCO, SCO_OPTIONS, &so, &opt) < 0)
{
syslog(LOG_ERR, "Can't get SCO options. %s(%d)",
strerror(errno), errno);
exit(1);
}
baswap(&ba, &rem_addr.sco_bdaddr);
gettimeofday(&tv_beg,NULL);
printf("Connected to %s\n", batostr(&ba));
syslog(LOG_INFO,"Sending ...");
if ((fd = open(filename, filemode)) < 0)
{
perror("Can't open input/output file");
return -1;
}
long i=0;
rlen=1;
while((rlen=read(fd, buf, so.mtu))>0)
{
i++;
if (send(s, buf, so.mtu, 0) == -1)
{
perror("send");
close(s);
close(fd);
exit(1);
}
else
{
printf("sequence-number: %d : %d Bytes\n", i, rlen );
}
usleep(10);
}
if (rlen==0)
{
printf("Datei zu Ende \n");
}
else
{
if (rlen < 0 )
{
printf("Fehler beim Lesen\n");
}
}
printf("Closing File\n");
close(fd);
printf("Done\n");
printf("Closing socket\n");
wait(10);
close(s);
printf("Done\n");
return (0);
}


int main()
{
struct sigaction sa;
int s, s1, opt;

if (!(buf = malloc(data_size)))
{
perror("Can't allocate data buffer");
exit(1);
}
memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
sa.sa_flags = SA_NOCLDSTOP;
sigaction(SIGCHLD, &sa, NULL);

openlog("scotest", LOG_PERROR | LOG_PID, LOG_LOCAL0);

if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0 )
{
syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
exit(1);
}
loc_addr.sco_family = AF_BLUETOOTH;
loc_addr.sco_bdaddr = bdaddr;
if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 )
{
syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
exit(1);
}
if( listen(s, 10) )
{
syslog(LOG_ERR,"Can not listen on the socket. %s(%d)", strerror(errno), errno);
exit(1);
}
opt = sizeof(rem_addr);
while(1)
{
if ((s1 = accept(s, (struct sockaddr *)&rem_addr, &opt)) < 0 )
{
printf ("Can't connect.\n");
}
baswap(&ba, &rem_addr.sco_bdaddr);
send_mode(s1);
}
}



Und nun der Client:



#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <errno.h>
#include <signal.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <netdb.h>
#include <sys/socket.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/sco.h>



unsigned char *buf;
struct sockaddr_sco loc_addr, rem_addr;
int s;
/* Default data size */
long data_size = 672;

bdaddr_t bdaddr;

float tv2fl(struct timeval tv)
{
return (float)tv.tv_sec + (float)(tv.tv_usec/1000000.0);
}

void do_listen( void (*handler)(int sk) )
{

int s, s1, opt;
bdaddr_t ba;

while(1)
{
opt = sizeof(rem_addr);
if( (s1 = accept(s, (struct sockaddr *)&rem_addr, &opt)) < 0 )
{
syslog(LOG_ERR,"Accept failed. %s(%d)", strerror(errno), errno);
exit(1);
}
if( fork() )
{
/* Parent */
close(s1);
continue;
}
/* Child */

close(s);

baswap(&ba, &rem_addr.sco_bdaddr);
syslog(LOG_INFO, "Connect from %s\n", batostr(&ba));

handler(s1);

syslog(LOG_INFO, "Disconnect\n");
exit(0);
}
}

void recv_mode(int s)
{
struct timeval tv_beg,tv_end,tv_diff;
long total;
uint32_t seq;
char *filename="/prtlab08/Documents/hnp_projekt/rage1.mp3"; //Filename
int fd, i; //File-Descriptor
mode_t filemode= O_RDWR | O_APPEND | O_CREAT;

syslog(LOG_INFO, "Receiving ...");

if ((fd = open(filename, filemode,0644)) < 0)
{
perror("Can't open input/output file");
return ;
}
else
{
printf("File erfolgreich geöffnet\n");
}
int r = 1;
seq = 0;
i=0;
while(r > 0)
{
//printf("Vor dem Receive");
if ((r=recv(s, buf, sizeof(buf), MSG_WAITALL)) <= 0) //MSG_WAITALL
{
perror("recv");
exit(1);
}
else
{
i++;
write(fd, buf, sizeof(buf));
printf("Received sequence number %d and numbytes= %d\n", i, r);
}
}
close(fd);

}


int main()
{
struct sigaction sa;
int s1, opt;
bdaddr_t ba;

if (!(buf = malloc(data_size)))
{
perror("Can't allocate data buffer");
exit(1);
}

memset(&sa, 0, sizeof(sa));
sa.sa_handler = SIG_IGN;
sa.sa_flags = SA_NOCLDSTOP;
sigaction(SIGCHLD, &sa, NULL);

openlog("scotest", LOG_PERROR | LOG_PID, LOG_LOCAL0);

if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0 )
{
syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
exit(1);
}
memset(&loc_addr, 0, sizeof(loc_addr));
loc_addr.sco_family = AF_BLUETOOTH;
loc_addr.sco_bdaddr = bdaddr;
if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 )
{
syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
exit(1);
}
// do_connect("00:10:DC:EA:05:47");
memset(&rem_addr, 0, sizeof(rem_addr));
rem_addr.sco_family = AF_BLUETOOTH;
baswap(&rem_addr.sco_bdaddr, strtoba("00:10:DC:EA:05:47"));
if( connect(s, (struct sockaddr *)&rem_addr, sizeof(rem_addr)) < 0 )
{
syslog(LOG_ERR, "Can't connect. %s(%d)", strerror(errno), errno);
return -1;
close(s);
}

syslog(LOG_INFO, "Connected\n");

recv_mode(s);
close(s);
return 0;
}




Danke schon mal im Voraus!

mfg winstonsmith

quinte17
19-01-2005, 18:08
ich kenn mich in der materie jetzt nicht so gut aus, aber ich dachte , dass bluetooth eine eigene fehlerkorrektur implementiert hatte...
könnte es sein, dass du mit einer art udp-protokoll rumschickst?

winstonsmith
19-01-2005, 22:39
Im Prinzip ja.

Der Server schickt bei der SCO-Verbindung einfach raus, so wie bei UDP-Paketen.
Da kann es schon mal passieren, das nicht alle Pakete ankommen.
Aber dies geschieht erst ab ein paar Metern.
Ich hab' zwei USB-Sticks und die sind knapp 2 Meter auseinander und da kann es nicht sein, dass die Daten nicht ordentlich ankommen.