- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Hálózati / IP kamera
- Windows 11
- Linux kezdőknek
- AI-gyártású celebpornóval küzd a Facebook
- Milyen routert?
- Otthoni hálózat és internet megosztás
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Mozilla Thunderbird
- Kodi és kiegészítői magyar nyelvű online tartalmakhoz (Linux, Windows)
-
IT café
Új hozzászólás Aktív témák
-
emitter
őstag
válasz Jester01 #1450 üzenetére
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ nc 127.0.0.1 9999
(UNKNOWN) [127.0.0.1] 9999 (?) : Connection refused
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ nc LAPTOP 9999
localhost.localdomain [127.0.0.1] 9999 (?) : Connection refused
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ ./client LAPTOP 9999
connect: Connection refused
és itt a két forráskód, server.cpp: [link]client.cpp: [link]
egyébként a gcc nem tud c++t fordítani, vagy rosszul tudom? és a g++ fordító nekem nem sírt, amikor a precedenciás-részt fordította... neked hogyhogy lefordult gcc-vel?
most átírtam mindent ahogy mondtad, zárójel nélkülire, de ugyanaz a helyzet. Az az érdekes, h netstat -l nem látja a server-t, pedig az fut (ps aux), és eljut az accept()-ig, mert ez még kiírja:
Halott folyamatok eldobva.
mind2 rész a 9999-es portot használja, (a kliens szintén, így, amit néztél kódot, még lehet, h egy régebbi verzió volt)
akkor a socklen_t-s részt hogyan csináljam? sin_size-t longintként hozzam létre, és úgy castoljam (socklen_t*)-vel
köszi, hogy segítesz! -
emitter
őstag
válasz Jester01 #1452 üzenetére
nemjó Connection refused.
miért fájt ez a myportos sor
oké, sin_size mostantól socklen_t, de nem ez volt a hiba
mondom, az az érdekes, hogy netstat nem látja hallgatózni a server-t
(amúgy ha a servert háttérben futtatom - &-vel, akkor utána hogyan tudok kilépni belőle - kill nélkül?)
mod: és frissítettem a kódokat is a neten
[Szerkesztve] -
Jester01
veterán
válasz emitter #1453 üzenetére
Figyi, te elloptad emitter nickjét? Neki azért sikerült egy aknakeresõ progit írni.
Az a sor NEM konvertálja az argv[1] stringet számmá ergo nem jó porton fog hallgatózni a szervered. Ha nem hiszed, írasd ki a MYPORT értékét.
Másik kérdésedre: az fg paranccsal elõtérbe hozhatod.Jester
-
emitter
őstag
válasz Jester01 #1454 üzenetére
hehe, régen volt... de miért is nem jó ez a castolás? ign, megnéztem, nem castolja át
int MYPORT = atoi(argv[1]);
így már jó a myport értéke, de a kliens még mindig nem csatlakozik... lehet, h vmi tűzfal-féleség megfogja? Sima ubuntum van, nem állítottam be semmiféle tűzfalat... igaz, egy routeren keresztül netezek, de a localhost kérés nem megy ki a routerig, vagy igen? -
emitter
őstag
válasz emitter #1457 üzenetére
az mitől van, hogy a cin egy sztring beolvasásánál a szóköznél kettévágja azt, és elég furcsa dolgokat művel
while(1){
cout << ''> '';
cin >> buf;
cout << buf;
cout << ''\nstrlen(buf): '' << strlen(buf) <<endl;
if(send(sockfd, buf, strlen(buf), 0) == -1){
perror(''send'');
exit(1);
}
}
ez a kérdéses kódom, és ezt írja ki:
> ki vagy?
ki
strlen(buf): 2
> vagy?
strlen(buf): 5
>
mintha a stdin-bemeneti puffert nem űrítené a szóköz beolvasása után, 2x fut le a ciklus, mire kiürül a puffer...
mivel tudnék segíteni a dolgon? (fflush(stdin)-re semmit nem csinál)
szóval azt szeretném ha szóközös sztringeket egybe venné
thx
mod: még annyit kérdeznék, hogy #include-nál C++ban mikor kell '''' közé és mikor <> közé rakni a libet: pl. ha a string libet akarom behúzni, azt hogyan kell helyesen? Tudom, h a C-s módszert is elfogadja, de én szeretnék teljesen C++valid lenni
[Szerkesztve] -
Jester01
veterán
válasz emitter #1458 üzenetére
Az >> operátor ugyanúgy szavakat olvas mint a scanf %s formátuma. Ha egész sort akarsz, akkor használd a getline függvényt.
A <> és az idézõjel pont ugyanazt jelenti mint c-ben, mégpedig a keresési útvonalat határozza meg. Ha idézõjelet használsz, akkor az aktuális fájlhoz képest értelmezett relatív elérési útvonallal megadott directoryban keresi elõször és csak utána a -I kapcsolóval megadott illetve a beépített helyeken. A C++ headerek .h kiterjesztés nélkül vannak, pl. #include <string>. De ez mást tartalmaz mint a string.h!Jester
-
emitter
őstag
válasz Jester01 #1459 üzenetére
értem. én egyelőre a <string.h>-t inklúdoltam, akkor gondolom majd nyávog a fordító, ha abban nincs benne valami, ami a string-ben megvan már...
getline-t én is néztem már, de az meg string típusba olvas be, és azt nem tudom konvertálni char*-ba, pedig sok függvény meg csak char*-t fogad el
mi akkor a megoldás?
mod: ja még1: ha üres ENTER-t akarok érzékelin mondjuk arra, hogy ha egy chatprogiban az egyik fél üres entert nyom, akkor bezáródjon a beszélgetés, szóval akkor ezt hogyan tegyem? ilyenkor a buf változó értéke (amibe beolvasom a sztringet), mit tartalmaz? \n-t vagy \r-t, vagy mit?
[Szerkesztve] -
Jester01
veterán
válasz emitter #1460 üzenetére
Elõször is eldöntöd, hogy mit akarsz használni. Ha maradsz a c ''stringeknél'' akkor a c-s stdio-t használod és a c-s függvényeket (strlen, fgets stb.) Ha c++ stringet használsz, akkor a c++ lehetõségeit használd (iostream, string stb). Ha pedig c++ stringbõl c string kell, akkor a c_str() metódussal azt is kaphatsz, de ez csak olvasható.
Jester
-
emitter
őstag
válasz Jester01 #1461 üzenetére
jó, akkor átállok C++ valid függvényekre első érdekesség: annak ellenére, hogy beinklúdoltam <string>-et, a g++ hibát dob, hogy length(), és size() was not declared in this scope...
pl így hívtam a size-t:
size(buf) //ahol buf char* típusú, de string típusúnál is ugyanezt dobja
mod: ja, és nem tudsz ajánlani egy jó kis c++ referenciát? mert a cpprefernce.com sokszor elég szűkszavú, meg számomra nem mindig egyértelmű
pl ez is: [link]
>> size_type length() const;
itt most a length mit vár? mi az a const uána
[Szerkesztve] -
Jester01
veterán
válasz emitter #1462 üzenetére
Huhh? Ha átálltál, akkor milyen buf-od van már megint? A size() az a string osztály metódusa:
#include <iostream>
#include <string>
using namespace std;
int main(int, char**)
{
string s;
getline(cin, s);
cout << ''length: '' << s.length() << '', size:'' << s.size() << endl;
return 0;
}
Esetleg a using-ot kifelejtetted?Jester
-
emitter
őstag
válasz Jester01 #1463 üzenetére
ja, hogy így kell hívni a length()-et ez nem jött le a prototípusából
namind1
szóval, most van egy string s; cuccom, és ebbe getline-nal olvasok.
s.length() okés. viszont:
if(send(sockfd, s, s.length(), 0) == -1){
...
erre a fordító:
client.cpp:64: error: cannot convert 'std::string' to 'const void*' for argument '2' to 'ssize_t send(int, const void*, size_t, int)'
???
send() sem c++ függvény?
mod: igen, mind3-at behúztam
#include <iostream>
#include <string>
using namespace std;
[Szerkesztve] -
emitter
őstag
Vááá!!!
Kezdem föladni, pedig nem kéne
Szóval mivel C++ban kell a progimat írnom, osztályba akarom rakni első lépésben a hálózati kapcsolat létrehozását végző kódot. Itt kezdődtek a bajok, amikkel már lassan 2 órája birkózom
Összefoglalom a helyzetet (egyelőre csak a szerver-progi):
-A főprogramban az osztály konstruktorát meghívnám a szerver-portcímével
myConn(const int srvport)
-Az osztálynak vissza kéne adnia valamilyen módon a főproginak a fájlleírót (hogy aztán tudjak vele send-elni, recv-elni), valamint esetleg a kliens sockaddr_in struktúráját, ez utóbbi nem annyira lényeges
Egyelőre nem akarom belinkelni a kódot, mert még kiröhögtök, de sajna még nagyon nem vágom az osztályokat, csak most kezdtük el... hasonlóan állok a refernciákkal is
Szóval várnám a javaslatokat, hogyan érdemes megoldani a vázolt feladatot: milyen módon adjak vissza a főproginak változókat/értékeket...
Előre is köszi!
emitter -
emitter
őstag
válasz Jester01 #1473 üzenetére
Na, akkor tovább homályosítom a képet:
van egy myConn nevű osztályom:
class myConn{
private:
int newfd; //ezt meg
struct sockaddr_in client_addr; //ezt kell visszadnia majd a tagfv-eknek
void buildConn(){...} //ez a fv végzi a tényleges kapcsolatépítést
public:
myConn(const int srvport){ buildConn(srvport); }
~myConn(); //kell egyáltalán a destruktor???
int getFD(){ return newfd;} // 1. tagfv
sockaddr_in getClientAddr() { return client_addr;} // 2. tagfv
}
ez a vázlat eddig a szintig helyes?
mod: egy kis szintaktikai modding...
[Szerkesztve] -
emitter
őstag
válasz Jester01 #1475 üzenetére
értem, akkor írok destruktort is.
viszont ha nem adom ki a newfd-t, akkor hogyan mondom meg a send()-nek, hogy melyik fd-re üljön?
mod: ja és a mainből a destruktort hogyan kell hívni? ~myConn(); ra hibát dob, viszont sima myConn()-nál honnan tudja, hogy az a destruktor és nem egy arg-nélküli konstruktor?
[Szerkesztve] -
emitter
őstag
válasz emitter #1476 üzenetére
és mégegy hiba, amire nem tudok rájönni:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ g++ -Wall -o server_oop server_oop.cpp
server_oop.cpp: In member function 'void myConn::buildConn(int, int&, sockaddr_in&)':
server_oop.cpp:71: error: argument of type 'void (myConn:: )(int)' does not match 'void (*)(int)'
ezt erre a sorra dobja:
sa.sa_handler = sigchld_handler; //levag minden halott folyamatot
ez a sor ugyanis a buildConn() fv-ben van, ami a private részben van.
előtte szintén a private részben van egy ilyen fv:
void sigchld_handler(int s){
while(wait(NULL) > 0);
}
amíg nem írtam át a progit osztályosra, addig simán működött a dolog
[Szerkesztve] -
Jester01
veterán
válasz emitter #1476 üzenetére
Destruktort (általában) nem kell meghívni, az meghívódik az objektum megszûnésekor magától. Ha mégis meg akarod hívni (de most nem ) akkor simán metódushívással (objektumpéldányra!)
A másik problémádra: az a baj, hogy a tagfüggvények implicit elsõ paraméterként megkapják az objektumra mutató pointert (this). Igy aztán már nem egyezik a prototípus. Csinálj belõle static metódust, az nem kap this pointert. Viszont abban ebbõl kifolyólag nem is hivatkozhatsz nem static tagokra.
MOD: ja és a send()-nek természetesen úgy mondod meg, hogy egy tagfüggvénybe rakodm, ezáltal elrejtve az implementációt.
[Szerkesztve]Jester
-
emitter
őstag
válasz emitter #1477 üzenetére
átírtam, szerintem most jónak kell már lennie, viszont még mindig az #1477-ben leírt hibát adja
nem is értem ezt a sort:
sa.sa_handler = sigchld_handler;
miközben a fv definíciója ez:
void sigchld_handler(int s){
while(wait(NULL) > 0);
}
hogyan hívhatok egy paraméteres fv-t paraméter nélkül az az érdekes, hogy ugyanez a fv-hívás működött régebben, mikor még osztály nélkül írtam meg a progit...
szerinted hol a hiba, mit javítsak?
és felraktam a táramra a legújabb server_oop.cpp-t.. -
emitter
őstag
válasz Jester01 #1484 üzenetére
a minimal playback program ([link]) kódját próbáltam egy-az-egyben futtatni, és egy sor hibát dobott:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ gcc -Wall -o wav2 wav2.c
wav2.c:89: warning: return type defaults to 'int'
wav2.c: In function 'main':
wav2.c:127: warning: passing argument 3 of 'snd_pcm_hw_params_set_rate_near' makes pointer from integer without a cast
/tmp/ccIhl5R0.o: In function `main':
wav2.c:(.text+0x34): undefined reference to `snd_pcm_open'
wav2.c:(.text+0x4b): undefined reference to `snd_strerror'
wav2.c:(.text+0x87): undefined reference to `snd_pcm_hw_params_malloc'
wav2.c:(.text+0x9e): undefined reference to `snd_strerror'
wav2.c:(.text+0xd9): undefined reference to `snd_pcm_hw_params_any'
wav2.c:(.text+0xf0): undefined reference to `snd_strerror'
wav2.c:(.text+0x12d): undefined reference to `snd_pcm_hw_params_set_access'
wav2.c:(.text+0x144): undefined reference to `snd_strerror'
wav2.c:(.text+0x181): undefined reference to `snd_pcm_hw_params_set_format'
wav2.c:(.text+0x198): undefined reference to `snd_strerror'
wav2.c:(.text+0x1d7): undefined reference to `snd_pcm_hw_params_set_rate_near'
wav2.c:(.text+0x1ee): undefined reference to `snd_strerror'
wav2.c:(.text+0x22b): undefined reference to `snd_pcm_hw_params_set_channels'
wav2.c:(.text+0x242): undefined reference to `snd_strerror'
wav2.c:(.text+0x27d): undefined reference to `snd_pcm_hw_params'
wav2.c:(.text+0x294): undefined reference to `snd_strerror'
wav2.c:(.text+0x2c8): undefined reference to `snd_pcm_hw_params_free'
wav2.c:(.text+0x2da): undefined reference to `snd_pcm_prepare'
wav2.c:(.text+0x2f1): undefined reference to `snd_strerror'
wav2.c:(.text+0x33a): undefined reference to `snd_pcm_writei'
wav2.c:(.text+0x354): undefined reference to `snd_strerror'
wav2.c:(.text+0x393): undefined reference to `snd_pcm_close'
collect2: ld returned 1 exit status
---
ennek mi lehet az oka? ha int main()-re írom át, akkor is majdnem ugyanezeket dobja
pl. ''passing argument 3 of 'snd_pcm_hw_params_set_rate_near' makes pointer from integer without a cast'' - ha erre a függvényt így hívom, az jó?
snd_pcm_hw_params_set_rate_near (playback_handle, hw_params, (void*)44100, 0)
vagy honnan tudjam, hogy ez a fv milyen típusú mutatót vár 3. arg-ként?
és a többi undefined reference mit jelent?
---------
van egy másik próbálkozásom is, ez alapján: [link]
itt viszont vannak BYTE meg DWORD típusok, amit az ansi C nem ismer... ezek helyett írhatok CHAR, ill. INT típust, vagy ezeknek nem ugyanakkora a méretük?
[Szerkesztve] -
mesyre
csendes tag
Én Visaul Basicban dolgozom. Szeretem is. Ti hogy vagytok vele?
A programjaim: www.teamattic.com oldalon -
Jester01
veterán
válasz emitter #1485 üzenetére
Az undefined reference az linkelési hiba. Kell egy -lasound kapcsoló, mert ezek az alsa könyvtárban vannak.
honnan tudjam, hogy ez a fv milyen típusú mutatót vár 3. arg-ként
A legbiztosabb ha megnézed a header fájlban, hiszen a fordító is onnan tudja. De amúgy az alsa doksiban minden bizonnyal benne van.
A BYTE és DWORD típusokkal vigyázni kell, hogy amit használsz valóban 8 és 32 bit legyen. Ezt eselteg egy configure scripttel lehet ellenõrizni ami mindig kideríti melyik szabványos típus felel meg. De te most valóban nyugodtan írhatsz helyettük unsigned char-t és unsigned int-et.Jester
-
emitter
őstag
válasz Jester01 #1487 üzenetére
köszi, de sajna az asoundlib.h-ban csak újabb includok vannak, függvények nem... viszont egy (void*) casttal most szépen lefordul, nem warningol, viszont nem tudom, hogy milyen argot adjak meg indításkor:
...
if ((err = snd_pcm_open (&playback_handle, argv[1], SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
fprintf (stderr, ''cannot open audio device %s (%s)\n'',
argv[1],
snd_strerror (err));
exit (1);
...
szóval ezalapján szerinted mit adjak meg neki, és hova írjam, hogy milyen wavot játsszon le? -
emitter
őstag
válasz Jester01 #1490 üzenetére
de nekem olyan progi kéne, ami _tényleg_ lejátsza a fájlt!
akkor a minimal-playback nem jó, helyette ott van ez a wav-loader [link]
viszont sajna ez is hibákat dob:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ gcc -Wall -o wav1 wav1.c
wav1.c: In function 'main':
wav1.c:36: warning: pointer targets in passing argument 1 of 'strcmp' differ in signedness
wav1.c:38: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:41: warning: pointer targets in passing argument 1 of 'strcmp' differ in signedness
wav1.c:44: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:45: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:46: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:47: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:48: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:49: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
wav1.c:50: warning: passing argument 1 of 'fread' makes pointer from integer without a cast
itt a kódom: [link]
ha ez a hivatalos kód, akkor miért hibázik ennyit? castoljam az összes kérdéses részt? -
Jester01
veterán
válasz emitter #1491 üzenetére
Nemtom honnan szedted, de az összes hibás fread hívásból lemaradt egy & jel.
Amúgy a minimal playback progi kis módosítással lejátssza a wavod, ha nem baj, hogy a paramétereket nem a wavból veszi. Simán abban a lejátszó ciklusban feltöltöd a buf-t a fájlból (az elsõ - azt hiszem - 44 byteot átugrod, az a fejléc)Jester
-
emitter
őstag
válasz Jester01 #1492 üzenetére
oké, köszi
már csak 2 warning maradt, azokkal egyelőre nem foglalkozom, viszont az id 4 bájtos karaktertömbbe egyáltalán nem csak az első négy bájt kerül, hanem valami szemét is, ugyanis kiíratva ezt kapom:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ gcc -Wall -o wav1 wav1.c
wav1.c: In function 'main':
wav1.c:39: warning: pointer targets in passing argument 1 of 'strcmp' differ in signedness
wav1.c:44: warning: pointer targets in passing argument 1 of 'strcmp' differ in signedness
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ ./wav1
RIF˛˘żą˘żŘą˘ż˘^ޡ
Error: not a RIFF file
ahol az id értéke mindig ''RIF...'', azaz az első 3 karakter állandó, utána random szemét
kód: [link]
----
a minimal-playbacknél pedig ez van:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ ./wav2 hw:0,0
Szegmens hiba
kód: [link]
a lejátszást akkor hogyan oldhatom meg? a végén a for ciklusban kell valamit csinálnom a bufferral - mit is pontosan? melyik fv küldi a buffer tartalmát a hangkártyának? -
Jester01
veterán
válasz emitter #1493 üzenetére
Ezt a wav1.c-t sürgõsen felejtsd el! Fogalma sincs az ürgének mit csinál. Ha 4 byteos tömbbe olvas be, akkor azt pl. nem lehet strcmp-vel hasonlítani, mert nincs benne lezáró 0. Helyesen strncmp-vel 4 karakter hosszon stb. Ugyanezen okból nem tudod kiírni sem: %s-t próbáltál, ez pedig nem string, csak 4 karakter.
A wav2 nekem mûködik. Fordítsd debug infóval és nézd meg gdb-vel, hogy hol halálozik el.
melyik fv küldi a buffer tartalmát a hangkártyának?
Mégis mit gondolsz? Hiszen csak egyetlen hívás van a ciklusban, az snd_pcm_writei.
Egészen pontosan kell bele egy (f)read ami beolvassa a következõ 128 byteot. Gondolom érdemesebb lesz nagyobb buffert használni.Jester
-
emitter
őstag
válasz Jester01 #1494 üzenetére
wav1.c:
most tettem a 4 karakter után egy lezáró \0-t is, de most is szegmens hibázik [link]
---
wav2.c:
gdb-t hogyan kell használni? ad egy promptot, oda mit írjak? (előtte -g-vel fordítottam a kódot)
egyébként mit értesz az alatt, hogy nem a wav-ból veszi a paramétereket a progi? ha nem abból, akkor honnan?
szóval ha jól értettem, akkor a snd_pcm_writei elé kell egy fread, ami a bufba beolvassa a wav tartalmát, kivéve az első x (44?) bájtot? -
emitter
őstag
válasz Jester01 #1496 üzenetére
az a negyedik karakter: id[4] nem
gdb még mindig nem okés
(gdb) set args -Wall -g -lasound -o wav2
(gdb) run gcc wav2.c
Starting program: gcc wav2.c
No executable file specified.
Use the ''file'' or ''exec-file'' command.
(gdb)
???
mit nem csinálok jól?
---
a bedrótozás azt jelenti, hogy megpróbálja a legáltalánosabb paraméterekkel lejátszani a wavot? -
qestion
aktív tag
Mikor kell/célszerű belső - külső változót használni?
lokális - globálisa pálya
-
qestion
aktív tag
repeat
Tomb [ i ] := i*2;
Undeclared identifier: 'Tomb'
Hogy kellene deklarálni?
[Szerkesztve]a pálya
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!