// 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 );
#endifVoisit vielä rivinumeron kertoa.
Seuraavat rivit ainakin ovat aivan väärässä paikassa, ota ne pois:
#ifdef WIN32
closesocket( sock );
#else
close( sock );
#endifLisä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.