Skocz do zawartości
olka

[c/c++] Błąd Przy Kompilacji Prostego Serwera

Rekomendowane odpowiedzi

Cześć

próbuję skompilować prosty program serwera komunikującego się przez protokół sctp.

Źródło (zmodyfikowane o tyle, żeby wszystko było w jednym pliku):

http://icarus.cs.weber.edu/home/bob/cs3730...10lev1sec2.html

 

#include    <sys/socket.h>      /* basic socket definitions */ #include    <netinet/in.h>      /* sockaddr_in{} and other Internet defns */ #include    <arpa/inet.h>       /* inet(3) functions */ #include    <stdio.h> #include    <stdlib.h> #include    <string.h> #include    <netinet/sctp.h> #define LISTENQ     1024 #define SA struct sockaddr #define BUFFSIZE    8192 #define SERV_PORT   9877   /* TCP and UDP */   #ifndef HAVE_BZERO #define bzero(ptr,n)        memset (ptr, 0, n) #endif  sctp_assoc_t sctp_address_to_associd(int sock_fd, struct sockaddr *sa, socklen_t salen)   {          struct sctp_paddrparams sp;          int siz;             siz = sizeof(struct sctp_paddrparams);          bzero(&sp,siz);          memcpy(&sp.spp_address,sa,salen);          sctp_opt_info(sock_fd,0,                     SCTP_PEER_ADDR_PARAMS, &sp, &salen);          return(sp.spp_assoc_id);  }  int sctp_get_no_strms(int sock_fd,struct sockaddr *to, socklen_t tolen)   {           int retsz;           struct sctp_status status;           retsz = sizeof(status);            bzero(&status,sizeof(status));            status.sstat_assoc_id = sctp_address_to_associd(sock_fd,to,tolen);          getsockopt(sock_fd,IPPROTO_SCTP, SCTP_STATUS,&status, &tolen);          return(status.sstat_outstrms);  }    int main(int argc, char **argv) {     int     sock_fd, msg_flags;     char    readbuf [BUFFSIZE];     struct sockaddr_in servaddr, cliaddr;     struct sctp_sndrcvinfo sri;     struct sctp_event_subscribe evnts;     int     stream_increment = 1;     socklen_t len;     size_t rd_sz;          if (argc == 2)         stream_increment = atoi(argv[1]);     sock_fd = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);     bzero(&servaddr, sizeof(servaddr));     servaddr.sin_family = AF_INET;     servaddr.sin_addr.s_addr = htonl (INADDR_ANY);     servaddr.sin_port = htons (SERV_PORT);          bind(sock_fd, (SA *) &servaddr, sizeof (servaddr));     bzero(&evnts, sizeof (evnts));     evnts.sctp_data_io_event = 1;     setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, &evnts, sizeof (evnts));     listen(sock_fd, LISTENQ);     for (;; ) {         len = sizeof(struct sockaddr_in);         rd_sz = sctp_recvmsg(sock_fd, readbuf, sizeof (readbuf) ,                               (SA *) &cliaddr, &len, &sri, &msg_flags);         if (stream_increment) {             sri.sinfo_stream++;             if (sri.sinfo_stream >=                sctp_get_no_strms(sock_fd, (SA *) &cliaddr, len))                sri.sinfo_stream = 0;         }         sctp_sendmsg(sock_fd, readbuf, rd_sz,                       (SA *) &cliaddr, len,                       sri.sinfo_ppid,                       sri.sinfo_flags, sri.sinfo_stream, 0, 0);     } }

kompilacja kompilatorem gcc (wersja 3.3.4) kończy się komunikatem:

/tmp/ccjOT4vo.o(.text+0x5e): In function `sctp_address_to_associd':

: undefined reference to `sctp_opt_info'

/tmp/ccjOT4vo.o(.text+0x216): In function `main':

: undefined reference to `sctp_recvmsg'

/tmp/ccjOT4vo.o(.text+0x2ae): In function `main':

: undefined reference to `sctp_sendmsg'

collect2: ld returned 1 exit status

 

Nie mam pojęcia jak to ugryźć, wszystkie 3 funkcje są wymienione w pliku netinet/sctp.h.

 

Byłabym wdzięczna, gdyby ktoś oswiecił mnie o czym świadczy taki błąd (i jak go poprawić ;) )

Dziękuję

olka

Edytowane przez olka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W plikach .h podefiniowane sa tylko naglowki tych funkcji, zeby kompilator sie nie rzucal, ale ciala tych funkcji siedza w zewnetrznych bibliotekach, ktore trzeba dolaczyc, a ten blad swiadczy wlasnie o braku dolaczenia tych bibliotek.

Pewne standardowe biblioteki dolaczane sa zawsze, dlatego do wiekszosci czesto uzywanych funkcji nie trzeba tego robic, ale jak sie zaczyna troche bardziej kombinowac to juz tak wychodzi. SCTP to nie jest cos co siedzi w bibliotekach systemowych, wiec trzeba je dolaczyc.

Nie mam pojecia jak sie nazywa plik biblioteki z funkcjami do SCTP, ale bardzo prawdopodobne, ze tak samo, wiec sprobuj podczas kompilacji dodac parametr: -lsctp

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

W plikach .h podefiniowane sa tylko naglowki tych funkcji, zeby kompilator sie nie rzucal, ale ciala tych funkcji siedza w zewnetrznych bibliotekach, ktore trzeba dolaczyc, a ten blad swiadczy wlasnie o braku dolaczenia tych bibliotek.

Pewne standardowe biblioteki dolaczane sa zawsze, dlatego do wiekszosci czesto uzywanych funkcji nie trzeba tego robic, ale jak sie zaczyna troche bardziej kombinowac to juz tak wychodzi. SCTP to nie jest cos co siedzi w bibliotekach systemowych, wiec trzeba je dolaczyc.

Nie mam pojecia jak sie nazywa plik biblioteki z funkcjami do SCTP, ale bardzo prawdopodobne, ze tak samo, wiec sprobuj podczas kompilacji dodac parametr: -lsctp

1715870[/snapback]

Dzięki za wyjaśnienia, faktycznie pomogło.

 

pozdrawiam

olka

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...