
olka
Użytkownik-
Postów
8 -
Dołączył
-
Ostatnia wizyta
Osiągnięcia olka
Newbie (1/14)
0
Reputacja
-
Dzięki za wyjaśnienia, faktycznie pomogło. pozdrawiam olka
-
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
-
Bardzo dziękuję wszystkim za pomoc i szybki odzew! Właśnie takiej funkcji poszukiwałam :smile2: pozdrawiam wszystkich Olka
-
Witam, czy ktoś orientuje się jak odczytać rozmiar pliku z poziomu c w systemie LINUX ? Przejrzałam już masę kursów (głównie anglojęzycznych) i jedyne co znalazłam, to filesize(), ale podobno działa tylko pod windowsem/dosem (pod linuxem w każdym razie nie, bo sprawdzałam) Wiem, że istnieje możliwość otwarcia pliku z ustawienie wskażnika na jego końcu i odczytanie położenia tego wskaźnika, ale dla mnie jest to rozwięzanie: 1. Mało eleganckie 2. Niewygodne z uwagi na fakt, iż z tego pliku odczytywać będę dane, co wymusi konieczność ponownego pozycjonowania wskaźnika na początek pliku z góry dziękuję za wszelkie sugestie Olka PS zastanawiałam sie nad użyciem funkcji systemowej która sprawdziłaby rozmiar, ale nie wiem jak (i czy w ogole sie da...) przekazać to do zmiennej w c++
-
Wow DZIAŁĄ! , dzięki wielkie, temat ten otwierałam już na 2 innych forach, ale nikt nie odpisał mi nic, co by działało. Jesteś wielki ! Przepraszam, że tak ścieśniłam kod. Sądziłam, że to nieprzyzwoite zamieszczać taki długi post, którego i tak nie przeczyta. Kajam się, że był to błąd. A co do pętli z EOF - miałoby to znaczy: że powtarzaj tak długo, aż wpiszę znak końca pliku (ctrl + D), tak wyczytałam na stronie kursu jakiegoś uniwerku amerykańskiego... Stokrotne dzięki, z poważaniem olka
-
No właśnie, da się usunąć zamieszczonego posta? Bo wysłał mi się dwa razy :zonk: z poważaniem olka
-
Cześć, postanowiłam sobie ostatnio, że zacznę uczyć się C++ i postanowiłam napisać programik, który m. in. zapisuje do pliku znaki wprowadzone z klawiatury. Wszystko pięknie działa, inne opcje są bez zarzutu, tylko po zakończeniu pliku [ctrl + D] program wpada w dziwną pętlę, w ogóle nie reagując na wprowadzane z klawiatury litery. Czy znalazłby się ktoś tak uprzejmy, żeby mi pomóc? Przegooglałam już chyba wszystkie większe kursy w języku polskim i angielskim i nie znalazłam nic na ten temat... Poniżej zamieszczam najkrótszą wersję programu, z której można jeszcze wykumać o co chodzi, kompilowalną i powodującą zapętlenie PHP #include <iostream> #include <fstream> using namespace std; int pisz(char p[50]) { char powrot; cout<<"Wpisz tekst i wcisnij ctrl + d"<<endl; ofstream outfile (p,ios::out); int ch; do { ch=cin.get(); outfile.put (ch); } while (ch!=EOF); outfile.close(); return 0; } int pomoc() { char powrot; cout<<"tutaj wyswietla sie help do programu"<<endl; cout<< "Powrot do glownego menu ? [y] "; while (powrot!='y') cin>>powrot; return 0; } int program() { char r_w, p[50]; cout<<"Wybierz akcje :"<<endl; cout<<"x - utworz"<<endl; cout<<" h - pomoc"<<endl; cout<<" q - wyjscie z programu"<<endl; cout<<"Twoj wybor:"; //--tutaj następuje zapętlenie po powrocie z funkcji pisz do { cin>>r_w; } while (r_w!='r' && r_w!='w' && r_w!='x' && r_w!='q' && r_w!='h'); switch(r_w) { case 'x':{ cout<<"\n\t\t\t Podaj nazwe pliku"; cin>>p; pisz(p); break;} case 'q':{ exit(0);break;} case 'h':{ pomoc(); break; } } program(); return 0; } int main() { program(); return 0; } wstawienie cin.sync(); zarówno po zamknięciu pliku w funkcji pisz(); ani przed pobraniem znaku przez cin w program() nie pomaga. ps. używam kompilatora g++ pod linuxem ps.2 Proszę zważyć, że jestem raczej osobą początkującą w programowaniu
-
Cześć, postanowiłam sobie ostatnio, że zacznę uczyć się C++ i postanowiłam napisać programik, który m. in. zapisuje do pliku znaki wprowadzone z klawiatury. Wszystko pięknie działa, inne opcje są bez zarzutu, tylko po zakończeniu pliku [ctrl + D] program wpada w dziwną pętlę, w ogóle nie reagując na wprowadzane z klawiatury litery. Czy znalazłby się ktoś tak uprzejmy, żeby mi pomóc? Przegooglałam już chyba wszystkie większe kursy w języku polskim i angielskim i nie znalazłam nic na ten temat... Poniżej zamieszczam najkrótszą wersję programu, z której można jeszcze wykumać o co chodzi, kompilowalną i powodującą zapętlenie PHP #include <iostream> #include <fstream> using namespace std; int pisz(char p[50]) { char powrot; cout<<"Wpisz tekst i wcisnij ctrl + d"<<endl; ofstream outfile (p,ios::out); int ch; do { ch=cin.get(); outfile.put (ch); } while (ch!=EOF); outfile.close(); return 0; } int pomoc() { char powrot; cout<<"tutaj wyswietla sie help do programu"<<endl; cout<< "Powrot do glownego menu ? [y] "; while (powrot!='y') cin>>powrot; return 0; } int program() { char r_w, p[50]; cout<<"Wybierz akcje :"<<endl; cout<<"x - utworz"<<endl; cout<<" h - pomoc"<<endl; cout<<" q - wyjscie z programu"<<endl; cout<<"Twoj wybor:"; //--tutaj następuje zapętlenie po powrocie z funkcji pisz do { cin>>r_w; } while (r_w!='r' && r_w!='w' && r_w!='x' && r_w!='q' && r_w!='h'); switch(r_w) { case 'x':{ cout<<"\n\t\t\t Podaj nazwe pliku"; cin>>p; pisz(p); break;} case 'q':{ exit(0);break;} case 'h':{ pomoc(); break; } } program(); return 0; } int main() { program(); return 0; } ps. używam kompilatora g++ pod linuxem ps.2 Proszę zważyć, że jestem raczej osobą początkującą w programowaniu