Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Socket-ohjelma ei käänny

feltsu [01.06.2009 22:03:31]

#

// Code Block 2.1 - Header Includes
// This code block includes all of the standard Sockets API/Winsock headers
#ifdef WIN32                // Windows 95 and above
    #include "winsock2.h"
    #include "Ws2tcpip.h"
#else                       // UNIX/Linux
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <netdb.h>
    #include <arpa/inet.h>
#endif
// End Code Block 2.1 - Header Includes

#ifdef WIN32
    closesocket( sock );
#else
    close( sock );
#endif

// Code Block 2.2 - Redefinitions and globals for cross-compatibility
#ifdef WIN32                // Windows 95 and above
    WSADATA g_wsadata;      // Winsock data holder
    #define CloseSocket closesocket
    #define GetSocketError WSAGetLastError
    #define StartSocketLib WSAStartup( MAKEWORD( 2, 2 ), &g_wsadata );
    #define CloseSocketLib WSACleanup();
    #ifndef socklen_t
        typedef int socklen_t;
    #endif
#else                       // UNIX/Linux
    #define CloseSocket close
    #define GetSocketError errno
    #define StartSocketLib {}
    #define CloseSocketLib {}
#endif
// End Code Block 2.2 - Redefinitions and globals for cross-compatibility

#include <iostream>
using namespace std;
int main() {
    int err;
    StartSocketLib;

// BEGIN CODE BLOCK 2.3 - Create a Listening Socket on port 4000
    int sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    if( sock == -1 ) {
        cout << "Socket creation error!" << endl;
        return 0;
    }
    cout << "Socket created!" << endl;
// create a sockaddr_in for binding, listening on port 4000
    struct sockaddr_in socketaddress;
    socklen_t sa_size = sizeof( struct sockaddr_in );
    socketaddress.sin_family = AF_INET;
    socketaddress.sin_port = htons( 4000 );
    socketaddress.sin_addr.s_addr = htonl( INADDR_ANY );
    memset( &(socketaddress.sin_zero), 0, 8 );

    // bind the socket
    err = bind( sock, (struct sockaddr*)&socketaddress, sa_size );

    // listen on the socket
    err = listen( sock, 16 );
    // END CODE BLOCK 2.3 - Create a Listening Socket on port 4000

    // wait for an incomming connection now
    int datasock;
    datasock = accept( sock, (struct sockaddr*)&socketaddress, &sa_size );

    // receive data
    char buffer[128];
    err = recv( datasock, buffer, 128, 0 );

    cout << "Data received:" << endl;
    cout << buffer << endl;

    shutdown( datasock, 2 );
    CloseSocket( datasock );

    shutdown( sock, 2 );
    CloseSocket( sock );

    CloseSocketLib;
}

Tuota kun koitan compilee niin tulee että
Line 17 "expected constructor, destructor, or type conversion before '(' token"
ja
Line 17 "expected `,' or `;' before '(' token"

Käytän Dev-C++ ohjelmaa Windows XP:llä.

Joo sori jäi toi rivinumero sanomatta :( Joo elikkä se on toi:

#ifdef WIN32
    closesocket( sock );
#else
    close( sock );
#endif

Metabolix [01.06.2009 22:12:31]

#

Voisit vielä rivinumeron kertoa.

Seuraavat rivit ainakin ovat aivan väärässä paikassa, ota ne pois:

#ifdef WIN32
    closesocket( sock );
#else
    close( sock );
#endif

Lisäksi suosittelen string.h-otsikon sisällyttämistä, vaikka tuo sinulla ilmeisesti toimii ilmankin.

feltsu [01.06.2009 22:20:03]

#

Sitte tulee että

  [Linker error] undefined reference to `WSAStartup@8'
  [Linker error] undefined reference to `socket@12'

... :/

Metabolix [01.06.2009 22:35:16]

#

Linkitä winsock mukaan. Lisää Dev-C++:n projektin asetuksista linkkerin asetuksiin -lwsock32. Myös itsenäistä Googletusta voipi harrastaa sanoilla "undefined reference WSAStartup", löytyy 1500 tulosta.

feltsu [01.06.2009 22:38:47]

#

Niin sitä voikin, mut oon niin tyhmä etten ymmärrä ellei joku selitä :( Yleensä opin ihan hyvin jos joku kertoo mut jos ite pitää lukee oon sormi suussa. :( Mutta kiitoksia avusta, koitan seuraavalla kerralla googlettaa vähän enemmän.

PS. Yritin kyllä googlaa sitä aikasempaa erroria mutta sillä ei löytynyt mitään hyödyllistä.

Metabolix [01.06.2009 22:52:42]

#

feltsu kirjoitti:

PS. Yritin kyllä googlaa sitä aikasempaa erroria mutta sillä ei löytynyt mitään hyödyllistä.

Se onkin aivan eri asia, koska se on syntaksivirhe, jonka selvittämiseksi pääasia olisi ymmärtää perusasiat C-kielestä: close(sock) on funktiokutsu, ja sellaista ei voi olla tuossa kohti koodia.

Pääsääntö on, että jos kyseessä on linkkerin virhe, käytä ensin hakukonetta, ja jos muu virhe, katso tarkkaan, mitä kyseisellä rivillä ja edeltävillä riveillä on, syynää kaikki pilkut ja sulut ynnä muut ja kaiva lopuksi vielä C- tai C++-opas esiin ja ihmettele asiaa sen avulla. Yleensä syntaksivirheissä lukee jotain aivan muuta kuin todellinen ongelma, koska kääntäjä etsii koodista tiettyä asiaa eikä osaa arvailla, miksi koodissa on virheitä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta