olka Opublikowano 23 Października 2005 Zgłoś Opublikowano 23 Października 2005 (edytowane) 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 23 Października 2005 przez olka Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 24 Października 2005 Zgłoś Opublikowano 24 Października 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
olka Opublikowano 24 Października 2005 Zgłoś Opublikowano 24 Października 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...