Nowe posty

xx Jak usunąć kilka dowiązań twardych jednym poleceniem. (3)
2019-06-14, 12:12:10
xx Skrypt sprawdzający miejsce na dysku (1)
2019-06-13, 13:55:00
xx Samba server (3)
2019-06-10, 17:01:44
xx Skrypt tworzący użytkownika (3)
2019-06-07, 17:11:55
xx Jaki serwis komp. we Wrocławiu (0)
2019-06-06, 12:39:23
xx serwer wydruku (1)
2019-06-04, 13:57:58
xx mod_security i roundcube (0)
2019-05-27, 14:27:03
xx Touchpad po pewnym losowym czasie przestaje reagować (33)
2019-05-27, 10:14:21
xx [ROZWIĄZANY] przygotowanie zeskanowanego pdf do OCR (6)
2019-05-24, 14:46:43
xx Przydatne Linki (1)
2019-05-23, 18:05:04

Autor Wątek: bluetooth.c a bluetooth.cpp o co chodzi? :(  (Przeczytany 5227 razy)

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
bluetooth.c a bluetooth.cpp o co chodzi? :(
« dnia: 2007-04-17, 22:56:52 »
Witam

jak już pisałem w jednymm z wątków (ARIA....) nie mam doświadczenia w programowaniu pod systemem Linux. Jednak niektóre rzeczy potrafię zrobić. Poniżej kod programu (serwer bluetooth):
// nazwa pliku
// bluetooth.c


#include
#include
#include
#include
#include
#include
#include

#include
#include
/* ustawienie kanau, na ktrym serwer nasuchuje pocze */
#define COM_CHAN 11


struct sockaddr_rc sockaddr_loc, sockaddr_rem ;

int des_loc, des_rem, len;

bdaddr_t bdaddr_loc, bdaddr_rem ;
char *c, buf[20];

int main ()
{
/* Utworzenie gniazda (punktu kocowego) */
des_loc = socket (PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM) ;
if (des_loc == -1){
printf ("nCan't create socket: %sn", strerror (errno));
exit(1);
}
//memset (&(sockaddr_loc), 0, sizeof (sockaddr_loc)) ;
sockaddr_loc.rc_family = AF_BLUETOOTH ;
sockaddr_loc.rc_channel = htobs (COM_CHAN) ;
sockaddr_loc.rc_bdaddr = bdaddr_loc ;

// Wiazanie gniazda z adresem i portem
if(bind(des_loc,(struct sockaddr*)&sockaddr_loc,sizeof(struct sockaddr)) == -1){
printf("nCan't bind socket: %sn",strerror (errno));
exit(1);
}

if (listen (des_loc, 10) == -1){
printf ("nCan't listen on the socket: %sn") ;
exit (1) ;
}
printf ("nWaiting for connection on channe %d....n", COM_CHAN) ;
len = sizeof (sockaddr_rem) ;
des_rem = accept (des_loc, (struct sockaddr *) & sockaddr_rem, &len) ;
if (des_rem == -1)
{
printf ("ncan't accept connection: %sn", strerror (errno)) ;
exit (1) ;
}
if (close (des_loc) == -1)
{
printf ("nCan't close local socket: %sn", strerror (errno)) ;
exit (1) ;
}
bdaddr_rem = sockaddr_rem.rc_bdaddr ;
printf ("nConnected on channel: %d", btohs (sockaddr_rem.rc_channel)) ;
baswap (&bdaddr_rem, &sockaddr_rem.rc_bdaddr) ;
printf ("nfrom: %sn", batostr (&bdaddr_rem)) ;
len = recv (des_rem, &buf, sizeof (buf), 0) ;

if (len == -1)
{
printf ("nCan't recv data: %sn", strerror (errno)) ;
exit (1) ;
}
printf("Dane od klienta: %s n", buf );
if (send (des_rem, c="Jestem serwerem", 16, 0) == -1)
{
printf ("nCan't send: %sn", strerror (errno)) ;
exit (1) ;
}
if (close (des_rem) == -1){
printf ("nCan't close socket: %sn", strerror (errno)) ;
exit (1) ;
}
return 0 ;
}
generalnie chodzi mi o to, że jak kompiluje plik bluetooth.c poleceniem gcc -Wall -g -o bluetooth bluetooth.c -L/src/lib –lbluetooth to wszystko jest ok. Natomiast gdy zmienie rozszerzenie pliku na dokladnie bluetooth.cpp i skompiluje go tym samym poleceniem czyli gcc -Wall -g -o bluetooth bluetooth.c -L/src/lib –lbluetooth to pojawia się błąd:

error: invalid conversion from 'int *' to socklen_t*
error: initializing argument 3 of ' int accept(int, sockaddr *, socklen_t*)'


w tym przypadku chodzi o funkcję accept(). Czy może ktoś wie dlaczego taki błąd się pojawia. Czy to kwestia tego, że zmienijąc rozszerzenie pliku na cpp mówimy kompilatorowi że ma to być pisane obiektowo??? ale wyżej w funkcji bind() również jest określanie wielkości struktury adresowej i tam się nie czepia. Bardzo proszę o pomoc w tej sprawie/

pozdrawiam
noddie_23

[edit ZipoKing]: poprawka estetyczna: wrzuciłem kod do odpowiedniego znacznika BBCode

Offline Grzegorz Świtkowski

  • Users
  • Guru
  • *****
  • Wiadomości: 516
    • Zobacz profil
bluetooth.c a bluetooth.cpp o co chodzi? :(
« Odpowiedź #1 dnia: 2007-04-18, 10:37:01 »
Kompilator gcc przyjmuje różne standardy kompilowania w zależności od rozszerzenia źródła. Z man gcc:

       For any given input file, the file name suffix determines what kind of compilation is done:

       file.c
           C source code which must be preprocessed.
[...]

       file.cc
       file.cp
       file.cxx
       file.cpp
       file.CPP
       file.c++
       file.C
           C++ source code which must be preprocessed.  Note that in .cxx, the last two letters must both be literally x.
           Likewise, .C refers to a literal capital C.

A wbrew pozorom języki C i C++ różnią się i to znacznie. Jeśli piszesz kod w C to kompiluj go jako kod C.

Offline Kuba

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 43
    • Zobacz profil
bluetooth.c a bluetooth.cpp o co chodzi? :(
« Odpowiedź #2 dnia: 2007-09-29, 23:19:20 »
W C++ niekoniecznie musisz pisać obiektowo, ale musisz przestrzegać reguł tego języka, które wymagają pewnej logiki w posługiwaniu się wskaźnikami. Nie możesz przekazać f-cji wskaźnika do int'a jeżeli ta oczekuje wskaźnika do socklen_t, albo musisz powiedzieć,kompilatorowi sprost, że świadomie robisz taką dziwną operację.

Zmień deklarację len na typ socklen_t albo dorób rzutowanie w accept: (socklen_t*)(&len) i Twój kod powinien się kompilować także w C++ (przynajmniej pobieżnie patrząc nie widzę innych problemów).


I tak na marginesie (tzn. dla mnie główne pytanie): nadal zajmujesz się BlueToothem pod Linuksem?

Offline

  • Users
  • Guru
  • *****
  • Wiadomości: 825
    • Zobacz profil
bluetooth.c a bluetooth.cpp o co chodzi? :(
« Odpowiedź #3 dnia: 2007-09-30, 09:32:44 »
Zgadzam się z postem powyższym:)
Skoro program działa Ci w C to po co chcesz go kompilować w C++??
Program w c++ używa więcej i większych bibliotek niż w c.

Mariusz