Winsockstocket

Winsockstocket
2007-08-21T22:00:38+02:00
2007-08-29T07:13:09+02:00
2022-11-05T17:05:36+01:00
sypor
Üdv.
Nemrég kezdtem bele a hálózati progizásba, és rengeteg helyen kutattam. (Többek közt prog.hu/msdn)
Az msdn-en találtam egy igéretesnek látszó programot. kliens szerver kapcsolat felépítésére.
wiszont egyáltalán nem tudom lefordítani, kapásból 11 hibaüzi.
Valószinüleg linkelési hiba lesz, csak nem tudom mi.
+ Ezzel meg lehet oldani az interneteskomunikációt is?
környezet: Devcpp4.9.9.2, windows. (unix stb nem jó egyenlőre)
Ebbe kérném a segítségetek.
Mutasd a teljes hozzászólást!
Úgy tűnik példán kívül ezek a programok nem sokra jók.
A szerver progginak csak egy kliense lehet, hát elég izé.

Na mindegy, a programokban nem látok semmi különösöet, szerintem, azért nem működnek, mert a router meg a tűzfal bekavar. Biztos, hogy teljes hozzáférése van a programnak a hálózathoz?

Mert nálam, pl. a CnsNet ENUM-ja nem működik, ha a be van kapcsolva a tűzfal, még akkor is, ha a kommunikáció meg van neki engedve, ha kikapcsolom tűzfalat, megy az ENUM is működik.

Én azt javaslom, hogy ne vacakolj tovább azokkal a példaproggikkal, hanem próbálj magad készíteni egy hálózati programot.

Van egy leírásom az egészhez is különben, saját hülyeségeimmel kiegészítve (ezek vannak benne arial betűvel írva): sockets
Mutasd a teljes hozzászólást!

  • A http://msdn2.microsoft.com/en-us/library/ms737625.aspx weblapon találtam forrást winstock hoz.
    Környezet: Windows, devcpp4.9.9.2
    A projekt beállításoknál megadtam lib és az include elérési útvonalát.
    Elméletileg a Winsock mppábol még linkelni kéne a wsock32.lib vagy winsock32.lib vagy valami ilyesmi
    fájlt, de ezeket én nem találom a devcpp- almappáiban sehol. se a mppát se a fájlokat.(http://people.inf.elte.hu/triasz/progi/bgnet.html)

    Leírás:
    A program egyébként saját gépen létrehoz egyszervert, majd közvetlen utánna egy
    klienst, ami csatlaozik a szeverhez, ha jól látom.
    Ha tévedek kérlek szóljatok.


    A kód:
    #include "stdio.h" #include "winsock2.h" int main() { //---------------------- // Initialize Winsock WSADATA wsaData; int iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if (iResult != NO_ERROR) printf("Error at WSAStartup()\n"); //---------------------- // Create a SOCKET for connecting to server SOCKET ConnectSocket; ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return 0; } //---------------------- // The sockaddr_in structure specifies the address family, // IP address, and port of the server to be connected to. sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientService.sin_port = htons( 27015 ); //---------------------- // Connect to server. if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) { printf( "Failed to connect.\n" ); WSACleanup(); return 0; } printf("Connected to server.\n"); WSACleanup(); return 0; }

    Hibaüzenetek:

    [Linker error] undefined reference to `WSAStartup@8' [Linker error] undefined reference to `socket@12' [Linker error] undefined reference to `WSAGetLastError@0' [Linker error] undefined reference to `WSACleanup@0' [Linker error] undefined reference to `inet_addr@4' [Linker error] undefined reference to `htons@4' [Linker error] undefined reference to `connect@12' [Linker error] undefined reference to `WSACleanup@0' [Linker error] undefined reference to `WSACleanup@0' ld returned 1 exit status C:\Dev-Cpp\projektek\stocket\Makefile.win [Build Error] [Projekt1.exe] Error 1
    Mutasd a teljes hozzászólást!
  • Szia!

    Ez valóban linkelési hiba, a hibaüzenetből tökéletesen látszik...Nade ezzel nem jutottunk előrébb:D
    Nem biztos, hogy .lib kiterjesztésűek a fájlok, amiket hozzá kell adnod a a linker-hez.
    Pl. a Code::Blocks-ban - ami szintén ingyenes IDE, és csak ajánlani tudom - .a a kiterjesztésük - és a nevük se pont ugyanaz.
    Keress a DevCpp könyvtárában egy lib vagy vmi hasonló nevű könyvtárat abban kell(ene) lennie.
    Vagy ha nagyon nincs meg, térj át Code::Block-ra, és akkor lépésről lépésre el tudom mondani, mit kell csinálnod:D
    Remélem tudtam valamit segíteni.

    Üdv
    herf
    Mutasd a teljes hozzászólást!
  • Basszus még jó, hogy nem találta a kereső! a neve: /lib/libwsock32.a :) erre legközelebb jobban odafigyelek :)

    Viszont még mindíg nem stimmel valami...
    Ha elindítom a programot az a kimente h: Failed to connect.
    Miért?
    commandból és c++ fordítóbol is ez az üzi.
    Mért nem jön létre a kapcsolat?
    Mutasd a teljes hozzászólást!
  • A
    if (ConnectSocket == INVALID_SOCKET){...}
    rész után betettem egy ellenörzést.
    else {printf("Server ok!");}
    Ennek a válasza az, h Server ok, tehát a szever elméletileg létrejön, h kapcsolódni lehessen hozzá.
    Akkor hol a hiba?
    Mutasd a teljes hozzászólást!
  • Esetleg még ezt nézem, hogy nem-e kerül lezárásra a szerver a kliens előtt, de nem úgy néz ki.
    A stocket lezárását a WSACleanup(); fgv végzi?
    Mutasd a teljes hozzászólást!
  • Szia!

    Amit bemasoltal kodot az a teljes kod?
    Mert ha igen, akkor abban sehol sincs szerver:D
    A bemasolt kod, csak letrehoz egy socketet, es rogton kapcsolodik a localhost-on a 27015-os portra.
    Az
    if(ConnectSocket == INVALID_SOCKET) {}
    sor utan hiaba is irsz ki barmit, ott meg szerver sehol sincs.
    A szerver keszitesenek negy fobb lepese van:
    1: letrehozod a socketet - az a te kododban is megtortenik.
    2: bind-olod a megfelelo portra - ez mar hianyzik
    3: elkezdesz listen-elni - ez sincs meg.
    4: es vegul accept-tel fogadod a bejovo kapcsolatokat.

    Egy programbol nem igazan lehet szervert is es klienst is csinalni.
    Amit ide bemasoltal az a kliens resze.
    A szervert is kulon meg kell irnod. Leforditod, elinditod, es csak utana tudsz a klienssel csatlakozni hozza.
    Remelem tudtam segiteni.

    Udv
    herf
    Mutasd a teljes hozzászólást!
  • Igen,ez a teljes kód.
    De ha itt nincs is szerver, akkor mégois mihez kapcsolódik a kliens?( ha csak a saját gépemhez, akkor is mért ad "Failed to connect"-et)
    ASmúgy azé gondoltam, h van szerver, mert aforrásban ez van:
    ... printf("Connected to server.\n"); WSACleanup(); ...
    És mér tesznek akkor értelmetlen kódot az msdn-re?( pedig ez nem szokásuk...)
    Esetleg akkor tud valaki adni win/c++ forrást kliens-szerverre?
    (elég lenne, h klins csatizik elküld egy karaktert"A", és a szerver pedig visza válaszol "B"). (ezen már el tudnék indulni.) Nem vagyok az a tipus, hogy írj meg helyettem ezt azt, de ez eméletileg nem nay program, és már teljesen kétségbe vok esve, hogy ez sem megy, pedig tegnap rengeteg oldalt meglátogattam. és ha msdn nem jó, akkor mi..? :s
    Mutasd a teljes hozzászólást!
  • Hello!

    Eppen az a gond, hogy nincs mihez csatlakoznia, és ezért írja ki aprogram, hogy "Failed to connect".
    Ennek így kell működnie.
    A "Connected to server" szerintem senkinek se jelenti azt, hogy a szerver fut. Max az, hogy "Server is running".
    Figy:
    Teljes kódot nem adok, de itt egy részlet:

    //Inicializalas WSAStartup(MAKEWORD(1, 1), &wsaData) //server socket keszitese server_socket = socket(AF_INET, SOCK_STREAM, 0); //Beallitom az adatokat arra a gepre, amin vagyok myAddress.sin_family = AF_INET; //6666-os portra allitom myAddress.sin_port = htons(6666); //A sajat gepem IP cimet adom meg neki myAddress.sin_addr.s_addr = INADDR_ANY; memset(&(myAddress.sin_zero), 0, 8); //Bind-olok, hogy a szervert a megfelelo portra "tegyem" bind(server_socket, (sockaddr*)&myAddress, sizeof(sockaddr)) //Varom a beerkezo kapcsolatokat listen(server_socket, 10); //Ha jott, akkor elfogadom client_socket = accept(server_socket, (sockaddr*)&clientAddress, &sockaddrSize);
    Röviden ennyi.
    Az accept-et általában egy végtelen ciklusba szoktak tenni, és ha fogad egy kapcsolatot, azt egy új szállal kezeli le. Szal nem árt majd a szalkezelésnek sem utánanézni:D
    jah, és természetesen a fenti kóbol kimaradt a hibakezelés.
    Remélem mostmár tényleg menni fog.

    Üdv
    herf
    Mutasd a teljes hozzászólást!
  • Megnézem, hogymit tudok belőlle öszehozni.
    ha viszont még nem megy a szálkezelés, akkor is fogad 1 klienst, nem?
    Amúgyköszi asegítséget.
    ha öszejön egy működő progi, megy a pont
    melléksen: (Ha nem lenne netkapcsolatom, a szerverre saját gépen tud csatlakozni az ugyanazon gépen lévő kliens?)
    Mutasd a teljes hozzászólást!
  • Hello!

    Egy kliens csatlakozasat tudod fogadni mindenkepp, nem kell hozza se while ciklus, se szalkezeles.
    Es igen, siman tudsz csatlakozni localhostra internet kapcsolat nelkul is.
    Csak az a fontos, hogy a szervert, es a klienst kulon programban ird meg.
    Ha osszejott a kapcsolat, akkor meg erdemes utananezni a send() es a recv() parancsoknak.
    Sok sikert!

    Udv
    Rudi
    Mutasd a teljes hozzászólást!
  • Szia!
    Az msdn-en találtam mégre komplett forráskódokat.
    Aki azt mondja h nem nehéz találni működő forráskódt a nem mond teljsen igazat, ugyanis, ha tudd mit keress, tényle nem nehéz, viszont ha még nem értsz atémához, nagy bajba lehetsz :)

    Akik windows-ra akarnap progizni c++bn, azoknak itt a forrás az msdn-hez!
    Kliens:http://msdn2.microsoft.com/en-us/library/ms737591.aspx
    Szerverhez:http://msdn2.microsoft.com/en-us/library/ms737593.aspx

    Kipróbáltam és müxik.
    2 fájlt kell mjd hozzá belinkelni (elméletiled két dll-t).
    c+ban ezek:
    -libwsock32.a
    -libws2_32.a

    sok sikert mindenkinek a kezdéshez.
    Mutasd a teljes hozzászólást!
  • Van egy kis gondom:
    Kpróbáltam 3 embrrel, hogy müxik -e. (saját gépen tesztelve tökéltes.)
    Az első emberrel normálisan futott a kliens ésa server.
    a másik két emberrel viszont volt valami gond!
    Futtatja a szervert, és kapcsolódok hozzá.
    elküldök neki 14 bájtot, nálla kiírja, hogy megjött a 14 bájt, majda server is küld nekem 14 bájtot.
    a sever ezután lezárul.
    De neem valahogy nem érkezett meg a 2.két eseben a server üzenete!
    a kliens eredménye e volt:
    cliens 81.183.109.77 <- kapcsolódka létező géphez, amin fut a szerver bytes sent: 14 <- küldök 14 bájtot recv filed: 10054 <- valami hiba!, olyan is volt, hogy szerverválasz előtt connection closed(lehet, h ekkor még nem indíotta el a szervert)

    A szerver eredményei:
    Bytes received: 14 Bytes sent: 14 Connection closing...

    És mégsem jön a válazs, pedig a szerver fogadta a kliens üzenetét. Mi lehet a probléma?

    A források letölthetőek és megnézhetőek:
    Software & Services
    Mutasd a teljes hozzászólást!
  • hali.
    ha gondolod veyél fel msn-re: msnsypor@freestart.hu
    Mutasd a teljes hozzászólást!
  • Hello.

    Az msdn-en fent vannak a hibakodok jelentesei is.

    A 10054-es hibara ezt irja:
    WSAECONNRESET (10054)
    &#8226; Translation: Connection reset by peer.
    &#8226; Description: An existing connection was forcibly closed by the remote host. This error typically occurs if the peer program on the remote host is suddenly stopped, the host is restarted, or the remote host uses a hard close. See setsockopt (Wsapiref_94aa.asp) for more information about the SO_LINGER option on the remote socket. This error may also result if a connection was broken because of keep-alive activity that detects a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.

    Szerintem tul hamar ert veget a szerver programod. Pontosan viszont nem tudom.
    Probalj meg az adatok elkuldese utan egy kicsit varni, vagy ami megjobb, ha csak akkor lepsz ki a programbol, ha a kliens kuld mondjuk egy "EXIT"-et.

    MSNre nem veszlek fel, mert nem elek vele:D
    Nomeg amennyi idom van, nem mennenk sokkal tobbre, mint itt.
    A kododat este meg atnezem, hatha eszreveszek valamit, es korrigalom a mostani hozzaszolasomat.

    Udv
    herf
    Mutasd a teljes hozzászólást!
  • Wsetleg még arra gondoltam, nem-e a tőzfal akadályoz valahogy.
    pl az az ember, akivel skerült kapcsolatot létsíteni, neki nm volt tűzfala. Localhost-on me valósinű úgy sincs akadály.
    Mostmár a másik 3 embernek pedig aine volt tűzfala, mind a 10054-es üzenetet kaptam, bár ők engedélyezték a komunikációt a program számára. ( a tűzfal megkérdezte.)
    Amúgy feltételezzük, hogy a server lezárul rögtön, miután elküldte az adatokat....
    A kliensnek attól meg kéne érkezni a számáraelküldtt adatoknak, nem?( hisz el lettek küldve.)
    Mutasd a teljes hozzászólást!
  • esetleg a célgépen lévő router bekavarhat? vagy pl Kerio tűzfal?( ez csak az egyik tesztszerver adata volt.) de eddig 5ból csak 1 hez sikerült csatlakozni.
    Mutasd a teljes hozzászólást!
  • Nekem van egy programom, az a neve, hogy CNSNet. Ezzel helyi hálozaton lehet chat-elni, fájlokat küldözgetni, stb. (Vagy talán az interneten is? Nem próbáltam ki, próbáljátok ki ti)

    Teljes forráskódostul, mindenestül közkincsé teszem:

    link
    Mutasd a teljes hozzászólást!
  • Köszi szépen -=#Dávid#=- , de ez sana nem oldja meg a próblémám. azért köszi a reakciót.
    Mutasd a teljes hozzászólást!
  • Csak hát ha a forráskódból ki tudsz hámozni egyet s mást.
    Mutasd a teljes hozzászólást!
  • Helló

    lehet hogy hülyeség amit mondok mert csak gyorsan tfutottam a kódodat de a szerver részben szerintem van egy probléma. Miután accept-el fogadod a clientsocket-et utána lezárod a Listensocketet amiből szerintem az következik hogy több kliens már nem tud kapcsolódni mert nincs hova, ezért csak azzal az egy kliensel tudsz kommunikálni akit először fogadott a server.
    Ahhoz meg hogy több kliensel is tudj kommunikálni már többszálon kell őket kezelni, szerintem.

    ha meg tévedek valaki ugyis kijavít

    szerk:
    david megoldja ugylátom szálak nélkül
    ajánlom figyelmedbe

    Üdv
    Menyét
    Mutasd a teljes hozzászólást!
  • Köszike. Windows alatt különben is nagyon macerás a szálkezelés, CreateThread, CreateProcess vacakságok vannak benne, egyiket sem használtam még sosem.

    Amúgy a CNSNet nagyon windows specifikus proggi, tehát linux alá semmi értelme nincs lefordítani.

    Föleg a HandleTransmissions-t alprogramot érdemes megnézni. Az a lelke az egész progginak, szerintem.
    Mutasd a teljes hozzászólást!
  • Hát szerintem annyira nem bonyolult.
    épp most csinálgatok egy teszt szervert meg klienst
    a lényege annyi hogy egy végtelen ciklusban figyelem accept-el hogy van e bejövő kapcs aztána ha van akkor kiteszem egy külön szálba ami kezeli a kapcsolatot.

    valahogy ilyen formában:

    while(true) { client=accept(server,(struct sockaddr*)&from,&fromlen); AfxBeginThread(Client,(LPVOID)client); Sleep(1000); }

    a kezelő függvény meg valahogy így:
    UINT Client(LPVOID pParam) { SOCKET client=(SOCKET)pParam;; n=recv(client,buff,sizeof(buff),0); ....
    szálakból sendmessage fv-vel elérem a főprogit aztán kész is vagyok.
    persze nekem arra nincs szükségem hogy a szálak egymást is elérjék

    Üdv
    Menyét
    Mutasd a teljes hozzászólást!
  • A gondd nem ez. Valóban csak egyetlen klienst tud fogadni, de ez egyenlőre nem is probléma.
    A probléma az, hogy 7ből 5 esetben azt egy szerver-kliens páros sem futtaja normálisan.

    Észrevételek:
    -Van amikor a kliens küldi a bájtokat, a szerver megkapja, válaszol is, de a kliensnen nem érkezik meg a válasz, és egy idő után 10054-et ad.

    -egy másik esetben a klies elküldi a szervernek az adatokat, viszont a szerver (a célgépen), még azt sem írja ki, hogy jött volna adat stb, és csak ott áll egymagába a nagy sötét ablakával.

    Egyenlőre köszönöm, nem kérk a thread-ok ból, java-ba sem nagyon szeretem őket(és nem is igazán értek még hozzá).
    Amúgy elnézést, ha valaki félreértett a 7kapcsolat/2jó azt úgy értem, hogy mindíg újra van indítva aszerver a próba után(külön gépeken külön ip-vel), és csak egy klienst próbálok meg mindg csatolni, de általában ez sem sikerül.
    Mutasd a teljes hozzászólást!
  • Nemigazán tudom milehet a gond a progiddal.
    a hibakódról az MSDN ezt írja.
    valami SO_LINGER opciót emleget szerintem ennek nézz utána itt talán segít valamit.

    Üdv
    Menyét
    Mutasd a teljes hozzászólást!
  • Hello!

    Szerintem a tuzfal nem zavar be, ha engedelyezed a programot, nekem is van ZoneAlarm-om, siman megy.
    Viszont a router lehet, hogy bekavarhat, bar nem nagyon ertek hozza, meg sose volt veluk dolgom...:)
    Ahol nem ment a kapcsolat volt router?
    Mert, ha igen, akkor megvan a gond.:D

    A szerver es a kliens egy gepen van, es csak a localhostra csatlakozol, vagy ket kulonbozo gepen vannak?

    Udv
    herf
    Mutasd a teljes hozzászólást!
  • Szia. A saját gépem nem számítottam bele a 7 be. Localhost -on minden gondd nélkül fut.
    ahol nem futott, ott volt router, de nem tudom, hogy vajon mindegyiken volt-e mert a többieket nem kérdeztem meg.(csak 1 esetet)
    a 7 gép mindd külön szever volt, külön ip-vel, és saját gépről teszteltem.

    Viszont ha a router van, eméletileg annak sem szabadna gondot okozni, mert a router tudja ki kivel komunikál.( különben a net sem tudna menni normálisan, nem?) + hálózati játéknál sem megengedheő, hogy hardvertöl függjön, h megy -e a háló.
    Mutasd a teljes hozzászólást!
  • 10054: Connection reset by peer

    Ez a hiba akkor keletkezik, ha a szerver, vagy a kliens hirtelen kilép, vagy a kapcsolat csakúgy felbomlik.

    Nekem is rengeteg nyavajám volt a socketekkel, mielőtt helyes működésre bírtam volna őket.
    Mutasd a teljes hozzászólást!
  • Nekem nincs AfxBeginThread függvényem.
    Mutasd a teljes hozzászólást!
  • HAli. Ésvégülis hogy bírtad helyes működésre? Ha megnézed a forráskódot, találsz benne valamit, ai azt okozhatja, hogy valahol müxk a progi, valahol ne?
    És
    Nekem nincs AfxBeginThread függvényem.
    az baj??(vagy nekem fontos?)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd