// 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
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.
Sitte tulee että
[Linker error] undefined reference to `WSAStartup@8' [Linker error] undefined reference to `socket@12'
... :/
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.
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ä.
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.