Server-Anwendung in C++ mit Winsock

T

Thorsten777

Hallo,

ich habe hier eine Server-Anwenung in c++ die noch Fehler hat. Wahrscheinlich sinds nur Kleinigkeiten. Wäre super wenn mir jemand helfen könnte.
Unten ist der Fehlercode aufgelistet.

#include "stdafx.h"
#include <windows.h>
//#include <winsock2.h>
#include <stdio.h>
#pragma comment( lib, "ws2_32.lib" )

//Prototypen

int startWinsock(void);

int main()

{
long rc;

SOCKET acceptSocket;
SOCKET connectedSocket;
SOCKADDR_IN addr;

connectedSocket=accept(acceptSocket,NULL,NULL);

if(connectedSocket==INVALID_SOCKET)

{
printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());

return 1;
}

else

{
printf("Neue Verbindung wurde akzeptiert!\n");
}

// Winsock starten

rc=startWinsock();

if(rc!=0)

{
printf("Fehler: startWinsock, fehler code: %d\n",rc);

return 1;
}

else

{
printf("Winsock gestartet!\n");
}

// Socket erstellen

acceptSocket=socket(AF_INET,SOCK_STREAM,0);

if(acceptSocket==INVALID_SOCKET)

{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());

return 1;
}

else

{
printf("Socket erstellt!\n");
}


memset(&addr,0,sizeof(SOCKADDR_IN));

addr.sin_family=AF_INET;

addr.sin_port=htons(12345);

addr.sin_addr.s_addr=INADDR_ANY;

rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

if(rc==SOCKET_ERROR)

{
printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());

return 1;
}

else

{
printf("Socket an port 12345 gebunden\n");
}

return 0;
}


int startWinsock(void)

{
WSADATA wsa;

return WSAStartup(MAKEWORD(2,0),&wsa);
}

rc=listen(acceptSocket,10);

if(rc==SOCKET_ERROR)

{
printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());

return 1;
}

else

{
printf("acceptSocket ist im listen Modus....\n");
}


Fehler:

1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(112) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(112) : error C2065: 'acceptSocket': nichtdeklarierter Bezeichner
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(114) : error C2059: Syntaxfehler: 'if'
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(116) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(116) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(122) : error C2059: Syntaxfehler: 'else'
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(124) : error C2143: Syntaxfehler: Es fehlt ';' vor '{'
1>c:\users\thorsten\documents\visual studio 2008\projects\sock\socksrv\socksrv.cpp(124) : error C2447: '{': Funktionsheader fehlt - Parameterliste im alten Stil?
1>Das Buildprotokoll wurde unter "file://c:\Users\Thorsten\Documents\Visual Studio 2008\Projects\sock\socksrv\Debug\BuildLog.htm" gespeichert.
1>socksrv - 8 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
 
in startWinsock kennt der Compiler acceptSocket nicht, diese wird nämlich in der Mainfunktion deklariert.
 
Hallo,

der Code nach der Definition von startWinsock steht in keiner Funktion. Sollte dieser Teil vielleicht noch in die main? Rücke deinen Code einheitlich ein, dann ist er nicht nur für uns sondern auch für dich lesbarer. Und verwende dann bitte die Code-Tags ([code=cpp]Code[/code]), damit die Einrückung im Forum nicht verloren geht.

Grüße,
Matthias
 
super, vielen Dank!

es funktioniert jetzt nach dem ich die letzten 10 Zeilen in die main kopiert habe. int startWinsock kann dort bleiben.

C++:
  #include "stdafx.h"
#include <windows.h>
//#include <winsock2.h>
#include <stdio.h>
#pragma comment( lib, "ws2_32.lib" )
//Prototypen

int startWinsock(void);

int main()

{

  long rc;

  SOCKET acceptSocket;
SOCKET connectedSocket;
  SOCKADDR_IN addr;

  // Winsock starten

  rc=startWinsock();

  if(rc!=0)

  {

    printf("Fehler: startWinsock, fehler code: %d\n",rc);

    return 1;

  }

  else

  {

    printf("Winsock gestartet!\n");

  }

  // Socket erstellen

  acceptSocket=socket(AF_INET,SOCK_STREAM,0);

  if(acceptSocket==INVALID_SOCKET)

  {

    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());

    return 1;

  }

  else

  {

    printf("Socket erstellt!\n");

  }

memset(&addr,0,sizeof(SOCKADDR_IN));

addr.sin_family=AF_INET;

addr.sin_port=htons(12345);

addr.sin_addr.s_addr=INADDR_ANY;

rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

if(rc==SOCKET_ERROR)

{

  printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());

  return 1;

}

else

{

  printf("Socket an port 12345 gebunden\n");

}


rc=listen(acceptSocket,10);

if(rc==SOCKET_ERROR)

{

  printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());

  return 1;

}

else

{

  printf("acceptSocket ist im listen Modus....\n"); 

}

connectedSocket=accept(acceptSocket,NULL,NULL);

if(connectedSocket==INVALID_SOCKET)

{

  printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());

  return 1;

}

else

{

  printf("Neue Verbindung wurde akzeptiert!\n");

}


  return 0;

}





int startWinsock(void)

{

  WSADATA wsa;

  return WSAStartup(MAKEWORD(2,0),&wsa);

}
 
Hallo,

ich würde dir empfehlen gleich auch die 'select()'-Varriante zu machen. Falls du später mal mehrere Clients verwalten möchtest, außerdem ist die Funktion auch viel Resourcen schonender.
Gutes Tutorial findest du unter: http://www.c-worker.ch/tuts/select.php
Auf der Seite findest du auch noch die anderen Sachen, was mit Netzwerkprogrammierung zu tun hat.

Viel Spaß noch.
gruß Crash Kid
 
Zurück