/*********************************************************************

Ein sehr(!!) Simpler Socket Server.
-----------------------------------

Beachtet das es nur ein Beispiel ist welches nicht ausprogrammiert ist.
Es fehlen Anweisungen wie closesocket und WSACleanup.
Ebenfalls wird hier auch nicht verhindert das mehrere Verbindungen
hergestellt werden können.
Aber zum demonstieren wie man eine Verbingung annimmt und Daten
sendet und empfänget ist es recht geeignet.
Eventuell hat es auch noch einige Fehler im Code..

Testen könnt ihr ihn indem ihn auf '127.0.0.1 5432' eine telnet Verbindung
herstellt (telnet 127.0.0.1 5432). Er wird euch erst "Hallo" sagen,
und dann alle weiteren Daten welche ihr sendet mit "Ganz meine Meinung"
beantworten. Simpel halt.

by www.c-worker.ch

**********************************************************************/


#include <iostream.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock2.h>

#define  SERVER_PORT             5432
#define  RECV_BUF_MAXLEN         256
#define  SEND_BUF_MAXLEN         256


long WinsockStartup();


int main()
{
  long   rc;

  SOCKET sockListen;
  SOCKET sockConnected;
  SOCKADDR_IN addr;
  int addrlen = sizeof(addr);

  char sendBuf[SEND_BUF_MAXLEN+1];
  char recvBuf[RECV_BUF_MAXLEN+1];


  addr.sin_addr.s_addr = 0;
  addr.sin_family = AF_INET;
  addr.sin_port = htons(SERVER_PORT);


  rc = WinsockStartup();
  if (rc == SOCKET_ERROR)
  {
    cout << "Error: Winsock Startup failed: " << WSAGetLastError() << endl;
    return 0;
  }
  sockListen=socket(AF_INET,SOCK_STREAM,NULL);
  if (sockListen == INVALID_SOCKET)
  {
    cout << "Error: Cannot create Socket: " << WSAGetLastError() << endl;
    return 0;
  }
  rc = bind(sockListen, (SOCKADDR*)&addr, sizeof(addr));
  if (rc == SOCKET_ERROR)
  {
    cout << "Error: Cannot bind Socket: " << WSAGetLastError() << endl;
    return 0;
  }
  rc = listen(sockListen, NULL);
  if (rc == SOCKET_ERROR)
  {
    cout << "Error: Cannot listen: " << WSAGetLastError() << endl;
    return 0;
  }
  cout << "Waiting for a connection..." << endl;
  sockConnected=accept(sockListen, (SOCKADDR*)&addr, &addrlen);
  if (sockConnected == INVALID_SOCKET)
  {
    cout << "Error: Cannot accept connection: " << WSAGetLastError() << endl;
    return 0;
  }
  rc = send(sockConnected,"Hallo\0",6,NULL);
  if (rc == SOCKET_ERROR)
  {
    cout << "Error: Cannot send Data: " << WSAGetLastError() << endl;
    return 0;
  }
  cout << rc << " Bytes sent !" << endl;
  while (1)
  {
    rc = recv(sockConnected,recvBuf,RECV_BUF_MAXLEN,NULL);
    if (rc == SOCKET_ERROR)
    {
      cout << "Error: Cannot recv Data: " << WSAGetLastError() << endl;
      return 0;
    }
    if (rc == 0)
    {
      cout << "Other Host has closed the connection !" << endl;
      return 0;
    }
    recvBuf[rc] = '\0';
    cout << rc << " Bytes received: " << recvBuf << endl;
    rc = send(sockConnected,"Ganz meine Meinung\0",19,NULL);
    if (rc == SOCKET_ERROR)
    {
      cout << "Error: Cannot send Data: " << WSAGetLastError() << endl;
      return 0;
    }
    cout << rc << " Bytes sent !" << endl;
  }
}


long WinsockStartup()
{
  long rc;

  WORD wVersionRequested;
  WSADATA wsaData;
  wVersionRequested = MAKEWORD(2, 1);

  rc = WSAStartup( wVersionRequested, &wsaData );
  return rc;
}
