- Elektromos rásegítésű kerékpárok
- sh4d0w: Netflix? Ugyan, VW előfizetés!
- Luck Dragon: Asszociációs játék. :)
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- btz: Internet fejlesztés országosan!
- sziku69: Fűzzük össze a szavakat :)
- LordAthis: AI (és másra is használt) Cluster építése - Második Cikk
- eBay-es kütyük kis pénzért
- sziku69: Szólánc.
- WhrlpoolMind: Az eredeti lemez utánozhatatlan illata
-
LOGOUT
Új hozzászólás Aktív témák
-
qestion
aktív tag
repeat
Tomb [ i ] := i*2;
Undeclared identifier: 'Tomb'
Hogy kellene deklarálni?
[Szerkesztve] -
qestion
aktív tag
Mikor kell/célszerű belső - külső változót használni?
lokális - globális -
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? -
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? -
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. -
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 #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) -
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? -
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? -
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. -
mesyre
csendes tag
Én Visaul Basicban dolgozom. Szeretem is. Ti hogy vagytok vele?
A programjaim: www.teamattic.com oldalon -
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] -
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ülaz 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.. -
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] -
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] -
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
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ááá!!!
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 #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] -
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? -
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 #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ó.
-
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 #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! -
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] -
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? -
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. -
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] -
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! -
Jester01
veterán
válasz
emitter #1447 üzenetére
megint nem gondolkoztam mielőtt írtam: csak konvertálnom kellett (socklen_t*)-vel
Rossz ötlet volt. A változó típusát kell átállítani, nem a pointert castolni. Pl. ha a socklen_t 64 bites és te egy int* pointert adsz be átcastolva, akkor szépen felülíródik az utána lévõ memóriaterület elsõ 4 byte-ja.
nagy nehezen tájöttem a hibára:
if( sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1){...
a sockfd-s kifejezést még külön be kellett zárójelezni... de hogy miért
Operátor precedencia. Különben miért volt nehéz? A gcc warningot dob érte...
server.cpp:36: warning: suggest parentheses around assignment used as truth value
Ugye az accept-nél is zárójeleztél? Én különben is kerülöm az értékadás+feltétel kombinációt, jelen esetben abszolút semmit nem nyersz vele. Ha simán azt írod, hogy
newfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
if (newfd == -1){
az sokkal olvashatób és még a precedencia dologba sem szaladsz bele.
Ugye a szerver a 9999-es porton listenel? Mert a kód amit kitettél a netre az tojik a parancssorra és mindenképp a 3490-es porton figyel. (netstat -l)
MOD: és amúgy mûködik is:
hcs:/tmp> ./server
Kliens ciminfoja:
ip: 16777343
port: 33205
Program vege. Nyomj egy bill-t!x
hcs:~> nc 127.0.0.1 3490
Hello world!
[Szerkesztve] -
emitter
őstag
válasz
emitter #1447 üzenetére
valszeg a localhost miatt van a hiba, de miért???
a beej leírása szerint simán kéne menni egyazon gépen mind2 proginak (külön ablakból indítottam őket)
a szerver eljut az accept-ig, ott várakozik a kérésekre
a kliens viszont sajnos Connection refused-t dob
akár LAPTOP-ot írok hostként, akár 192.168.1.2-t, akár 127.0.0.1-t... -
RAM
őstag
Jól elbeszélgetsz magaddal.
xar, amikor nem tudsz tájönni... -
emitter
őstag
válasz
emitter #1446 üzenetére
nagy nehezen tájöttem a hibára:
if( sockfd = socket(AF_INET, SOCK_STREAM, 0) == -1){...
a sockfd-s kifejezést még külön be kellett zárójelezni... de hogy miért
-------------
közben újabb hiba, a szervert elindítva ugyanarról a gépről nem tudok rácsatlakozni
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ telnet LAPTOP 9999
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$
vagy
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ ./client LAPTOP 9999
connect: Connection refused
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$
ezek vajon miért
ja, természetesen előtte elindítottam a szervert:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ ./server 9999
Listening...
[Szerkesztve] -
emitter
őstag
válasz
emitter #1445 üzenetére
megint nem gondolkoztam mielőtt írtam: csak konvertálnom kellett (socklen_t*)-vel
viszont most újabb hiba jön futtatáskor, amivel már tényleg nem tudok mit kezdeni:
bind: Socket operation on non-socket
a server.cpp-t felnyomtam ide: [link]
ha a setsockopt()-ot bennhagyom (most ki van kommentezve), akkor is ugyanezt a hibát adja, csak bind helyett setsockopt-ra -
emitter
őstag
if(newfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size) == -1){
perror(''accept'');
exit(1);
}
erre miért dobja a g++, hogy:
emitter@LAPTOP:~/BME_nemet/Prog2/Nagyhazi$ g++ -o server server.cpp
server.cpp: In function 'int main()':
server.cpp:75: error: invalid conversion from 'int*' to 'socklen_t*'
server.cpp:75: error: initializing argument 3 of 'int accept(int, sockaddr*, socklen_t*)'
ezt egy az egyben a 'Beej útmutatója a hálózati programozáshoz' c. irományból szedtem ki, nem értem mit problémázik
egyébként ilyen típusúak a kérdéses változók:
...
int sockfd, newfd;
int sin_size;
struct sockaddr_in client_addr;
... -
Jester01
veterán
1. mi nem jó? Nekem szépen kilép az összes egymásbaágyazott shellbõl. Amúgy meg természetesen magadnak is ellenõrizheted a subshell visszatérési értékét ($?)
2. már írtam, hogy nem a ciklussal van a baj. Példa:
global=0
for((i=0;i<10;i++))
do
echo -n ''$i ''
global=$i
done
echo ''global=$global''
$ ./t.sh
0 1 2 3 4 5 6 7 8 9 global=9
CSAK akkor nem jó, ha valami oknál fogva másik shellben fut. -
emitter
őstag
Szeretnék csinálni első lépésben egy kliens-szerver párost, localhoston kéne beszélgetniük, Linuxon.
Hogyan kell megírnom a szervert? Értem ezalatt, hogy csak hallgatózzon és ha jön egy kérés, akkor kapcsolódjon össze a kleinssel, vagy csak egy bizonyos porton várjon egy adott ip-ről kéréseket? A kliens pedig tudván előre a szerver ip-jét és portját, simán connect()-tel kapcsolódjon hozzá? Stream socketet használok.
Ha a szerver csak hallgatózik, akkor hogyan tudom megállapítani, hogy a csatlakozó kliens tényleg a várt ügyfél, nem pedig egy ''betörő''?
(A progim (wav-streamet küldenék lejátszásra a szervermek) később úgy lenne használatos, hogy mondjuk megadhatom én a kliensen a szerver ip-jét és nyitott portját, majd erre kapcsolódok. Vagy szerintetek ne így csináljam meg a dolgot?)
Köszi!
mod: Vagy én tudom rosszul, és a szerver csak hallgatózva tud a klienshez kapcsolódni, szóval connect()-tel nem?
[Szerkesztve] -
Jester01
veterán
Vegyük észre, hogy itt a jó öreg subshell problémával állunk szemben.
A ctrl+c múködését pedig (bunkó módon) egy kill -INT $$ utasítással lehet szimulálni
MOD: ez sem jó, mert a $$ nem az aktuális shell pidje
Tyrael: A break-nek lehet megmondani, hány szintet ugorjon.
[Szerkesztve] -
Tyrael
senior tag
nemtom konkretan melyik programnyelvrol beszelunk(mar latom, hogy unix shell script), nem is vagyok programozo, de:
php-ban ugy mukodik, hogy fuggveny futasa kozben definialt valtozok nem lesznek globalisak.
szal ha definialod talal-t 0-ra, majd meghivsz egy sajat function-t, ott csinalsz valamit, es talal-t atallitod 0-ra, akkor miutan viszatersz a fuggvenyhivas helyere talal meg mindig 0 lesz, mert te a fuggvenyen beluli talal valtozot valtoztattad meg.
hogy jol mukodjon, a function-on belul szukseg van a
global $talal;
sorra, utana mar nyugodtan valtoztathatod a $global erteket, es globalisan is valtozni fog.
sorry, ha nagy hulyeseget irtam, de lehet hogy nalad is valami ilyesmi a baj, nezz utana az adott programnyelv leirasaban a valtozok hataskore hogy van megszabva.
Tyrael
[Szerkesztve] -
Tyrael
senior tag
exit-nek nem lehet megadni, hogy hany szintet lepjen vissza?
mintha olvastam volna valami ilyesmi lehetoseget
illetve be lehetne vezetni egy talal valtozot is.
te esetedben mikor kiirja alma-t, akkor beallitja a talal valtozot mondjuk 1-re, es mikor kiirna a mogyorot, akkor megvizsgalod, hogy talalnak mi az erteke, es ha 1, akkor nem lep bele.
vagy ilyesmi
Tyrael -
QuarK
senior tag
-
Orc
senior tag
válasz
Jester01 #1426 üzenetére
Nem jó, mert ha pl. van egy while ciklusban egy for ciklus és abban egy elágázás majd abban az exit, akkor nem lép ki mindenből, sajnos a while ciklus utáni résszel is foglalkozik.
pl.:
while [[]valami]]
do
for (valami)
do
if [[valami]];then
a=1
echo alma
exit 1
fi
done
done
echo mogyoró
(echo $a)
Azt akarom, hogy ha almát kiír, akkor mogyorót már ne írjon ki, de ez így nem müködik, mind a kettőt kiírja.
A másik meg az, hogy hiába adtam meg az ''a'' változó értékét ez elágazásban a script végén az echo $a nem ír ki semmit(pedig azt kiírja, hogy alma).
mod: Olyan hatású parancs kellene, ami ugyanazt csinálja, mintha a script futása közben nyomnék egy ctrl+c-t.
[Szerkesztve] -
arato
csendes tag
Sziasztok!
Szükségem lenne valamilyen anyagra a programozás feljlődéséről.
Itt konkrétan nem arra lennék kíváncsi hogy a gépi kódot az asembly ... második generációs nyelvek... 3. generációs nyelvelek...... követték, hanem arra hogy a gépi kód miért avult el miért volt szükség a fejlesztésre, hogy alakultak ki a további nyelvek és miért, mik voltak a kiváltó okok mint pl. a szoftwareválság meg ilyesmik!!!!!
Ha valaki tanult ilyesmikről vagy tud egy jó könyvet, akkor nagyon örülnék ha meg tudná ani a tankönyv vagy az irodalom címét, esetleg web címét, vagy bármilyen formába tudna segíteni!!!
előre is köszi!!!!!
email címem: arato@vipmail.hu -
Orc
senior tag
Mely parancsal lehet egy unix scriptból azonnal kilépni?
Tehát van egy script:
#!/bin/bash
blablabla(while,for,if,stb)
if [[ $a -eq 1 ]];then
echo ''nyomi''
kilép
fi
blablabla2(csak itt lesz vége a while,for,stb ciklusoknak)
Azt szeretném, hogy a ''kilép'' parancs után már semmivel se foglalkozzon, álljon le, egy nyamvadt karaktert se olvasson be. Azt hittem az exit, break megfelelő lesz de nem,valami ''durvább'' kell.
Előre is köszi. -
Orc
senior tag
Köszönöm mindkettőtőknek, lényegében ugyanarra gondoltatok.
-
Spyx
tag
Hi allz.
Nagybajban vagyok. elakadtam a HF-el.
Java-ban kell írnom egyolan programot ami hasonlít az ICQ-hoz persze csak nagyon kevéssé. És az a lényeg hogya server és a kliensek CORBA-val kommunikáljanak.
Azt hogyan tudom megoldani hogy az egyik kliens egy metódust hív ami felszólítja a servert hogy küldjön egy szöveges üzenetet egy másik kliensnek? persze az első kliens valami név alapján vagy id alapján mondja meg hogy melyik másik kliensnek küldje az üzit. Please help.
A szerver egyenlőre csak a bejelntkezett kliensek neveit és id-ját tárolja. Ott a problémám igazából hogy egyáltalán még a serverről sem tudok üzit küldeni a klienseknek vissza anélkül hogy a kliens meghívna egy metódust.
Remélem azért érthető valamennyire a problémám.
Spyx -
Orc
senior tag
Egy kis segítséget szeretnék kérni:
Kellene egy olyan unix script, ami el tudja dönteni, hogy a megadott szám (pl 123456789)-ban minden számjegy egyszer szerepel-e.
Előre is köszi. -
corm
senior tag
válasz
Szebusz #1413 üzenetére
Html űrlappal:
<FORM action=''mailto: akarki@akarmi.akarmi'' method=''post'' enctype=''text/plain''>
<table>
<tr>
<td><p>kerdes:</p></td>
<td><p><INPUT type=radio>a</p></td>
<td><p><INPUT type=radio>b</p></td>
<td><p><INPUT type=radio>focizni</p></td>
<td><p><INPUT type=submit>Mehet!</p></td>
</tr>
</table>
</form>
ez egy kérdés, ebből kell neked három. Persze ez csak az ominózus rész, a html lap többi részét nem írtam le... -
Miracle
senior tag
-
Blackmate
őstag
A Java-ban meglévő IS_A, HAS_A dolgot hogyan lehetne C-ben implementálni?
-
emitter
őstag
mivel érdemes linuxon a hangot kezelni? openAL api? (egyelőre csak wavot akarnék lejátszani, de nem tudom, hol, mivel kezdjem
)
köcce -
Szebusz
csendes tag
heló kis segítség kéne.
ojan táblázatkéne hogy:
három fajta kérdés van, illetve válaszlehetőség
és az ember a neki szimpatikusakat bejelöli és aztén rákatint 1 gombra pl.mehet és akkor az adatokat elküldi 1 e-mail címre amit megadok.
segítsetek kérlek -
emitter
őstag
válasz
Miracle #1410 üzenetére
köszi
rendben, hogy a wav meg a socket is stream, de ez azt is jelenti, hogy nem tud adat elveszni, vagy lemaradni? mert olvastam a beej írásában, hogy lehet, h nem tud annyi adatot egy ciklusban átnyomni, amennyit én akarnék, így nekem kell ellenőrizni, hogy minden megérkezett-e. ez fennáll sock-stream esetében is, vagy csak a datagramnál? -
Miracle
senior tag
válasz
emitter #1409 üzenetére
(őszintén megmondom, a magyarsága borzasztó a fordításnak, majdnem elment tőle a kedvem, hogy lehet valaki ilyen pocsék helyesírású ) de azért átrágtam magam rajta
ott van az angol valtozat is. egyebkent meg valaki a szabadidejeben leforditotta, ha nem tetszik javitsd ki vagy ne hasznald.
szóval: ha én a progimban wav-streamet akarok [ ... ] szóval ebben az esetben milyen módot ajánlotok: stream, vagy datagram
ez nem _veletlen_ egybeeses
es ezen kívül: milyen fv-nyel érdemes küldeni a cuccost: send(), sendto(), write()?
a writeot semmikepp sem, a snedto fv. to es tolen parameterei ignoralva vannak connection-modu socketek eseten, mint pl. a SOCK_STREAM, igy ex-has valassz egyet, ugyan az a ketto.
aztán, úgy csináljam a dolgot, hogy nyitok én egy portot a gépen, vagy hagyjam a kernelre a random választást?
ahogy tetszik. habar a szerveren nem art tudni melyik porton figyel a progi mert oda kell csatlakozni a kliensnek. (es ha nem tudod nyilvan nehez)
az átküldött adatokat érdemes mondjuk md5-tel ellenőrizni (mármint hogy megérkezett-e minden rendben, vagy elvileg nem veszhet el adat?)
vaw stream eseten imho tok folosleges de ahogy erzed... nem lesz gaz.
mod: és mégegy dolog: Linuxon írom az egészet és C++ban kéne (ezt eddig nem is mondtam ) namost nekem csak egy gépemen van linux, azt lehet hogy csak látszólag küldöm a hálózatra a cuccost, hogy ki tudjam próbálni a működőképességét, de valójában mondjuk a saját ip-mre küldöm, így egyazon gépen futhat a kliens és a szerver progi? vagy hogyan oldjam meg ezt
127.0.0.1 szinte kivetel nelkul minden oprendszeren 1 loop-device, ami gyakorlatilag a localhostod, ide batran csatlakozhatsz. csatlakozhatsz emellett a sajat IP cimedre is, es akkor nem kell erre a 99.99999% valoszinuseggel letezo loop-devicera hagyatkozni. vagy feloldhatod a ''localhost'' domainnevet, az is magadra mutat majd. -
emitter
őstag
hi all!
elkezdtem olvasgatni hálózatos témában, c4-eXp által javasolt irományt nézegettem (őszintén megmondom, a magyarsága borzasztó a fordításnak, majdnem elment tőle a kedvem, hogy lehet valaki ilyen pocsék helyesírású) de azért átrágtam magam rajta
szóval: ha én a progimban wav-streamet akarok majd átküldözgetni egy bufferelt kliensnek (mármint hogy a kliensoldalon a vett adatokat bufferelem, és abból nyomom a hangkártyára)
szóval ebben az esetben milyen módot ajánlotok: stream, vagy datagram
és ezen kívül: milyen fv-nyel érdemes küldeni a cuccost: send(), sendto(), write()?
aztán, úgy csináljam a dolgot, hogy nyitok én egy portot a gépen, vagy hagyjam a kernelre a random választást?
az átküldött adatokat érdemes mondjuk md5-tel ellenőrizni (mármint hogy megérkezett-e minden rendben, vagy elvileg nem veszhet el adat?)
bármilyen tapasztalatotok van e témában, kérlek osszátok meg velem!
előre is köszönöm
mod: és mégegy dolog: Linuxon írom az egészet és C++ban kéne (ezt eddig nem is mondtam) namost nekem csak egy gépemen van linux, azt lehet hogy csak látszólag küldöm a hálózatra a cuccost, hogy ki tudjam próbálni a működőképességét, de valójában mondjuk a saját ip-mre küldöm, így egyazon gépen futhat a kliens és a szerver progi? vagy hogyan oldjam meg ezt
[Szerkesztve] -
corm
senior tag
Hali!
Valaki okos eltudja nekem magyarázni, hogy a .net timer-e miértnem képes megállítani magát? Se a stop, se a enabled = false módszer nem műxik. Elvileg pedig kéne neki... -
emitter
őstag
válasz
mcmester21 #1405 üzenetére
mod: ez privibe akart menni
[Szerkesztve] -
mcmester21
csendes tag
Köszi esetleg msnen megtudnánk beszélni? felvehetlek msnen?
-
emitter
őstag
válasz
mcmester21 #1403 üzenetére
írd csak nyugodtan
bár én pl legközelebb csak holnap délután tudok segíteni
-
mcmester21
csendes tag
Tudna valaki segiteni a c nyelvben? 3-4 feladatot kéne segiteni, nagyon egyszerűek csak én nem értek hozzá egyáltalán! Kérem irjatok hogy tudok e és irom a feladatokat!
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
- Shadow Of Mordor/GTA 5/RESIDENT EVIL II/CALL OF DUTY GHOSTS/STAR WARS SQUADRONS XBOX ONE JÁTÉKOK!
- Xiaomi Redmi Note 9 Pro 128GB, Kártyafüggetlen, 1 Év Garanciával
- Xiaomi Redmi Note 7 64GB, Kártyafüggetlen, 1 Év Garanciával
- TECHNOGYM RUN EXCITE 700 Futógép eladó
- Laptop i7, 11. gen., 32GB Ram, 512 SSD, újszerű számítógép
- GYÖNYÖRŰ iPhone 13 Pro Max 256GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3103
- HP EliteBook 820 G2 i5-6300U 8GB 256GB SSD 12.5" 1 év garancia
- Bomba ár! Dell Latitude 7390 - i7-8GEN I 16GB I 256GB SSD I 13,3" FHD I HDMI I Cam I W11 I Gari!
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7700X 32/64GB RAM RTX 5070 Ti 16GB GAMER PC termékbeszámítással
- ÚJ Lenovo LOQ 15IRX9 - QHD 165Hz - i7-13650HX - 16GB - 1TB - RTX 4060 - Win11 - 3 év garancia - HUN
Állásajánlatok
Cég: FOTC
Város: Budapest