Oon tekemäs luokkaa joka helpottaa winsockin käyttöä. Oon tehny siihen semmosen funktion jonka pitäs aina yhdistää serveriin/clienttiin uudestaan, mikäli yhteys on katkennut.
Funktio yhdistää clientin aina uudestaan serveriin, mikäli serveri on sammunut. Ongelma onkin siinä miksi serverin ja clientin välille ei synny uutta yhteyttä jos clientin sammuttaa ja käynnistää uudestaan.
Winsocket.h
#ifndef WINSOCKET
#define WINSOCKET 1
#include <winsock2.h>
#include <windows.h>
#include <wininet.h>
#include <string>
class Winsocket { //luokka helpottamaan winsockin käyttöä
    private:
        bool yhteys; //ollaanko yhteydessä
        bool server; //ollaanko serveri vai clientti, oletuksena ollaan serveri
        u_short port; //portti jonne konnektaudutaan
        char ip[20]; //ip jonne konnektaudutaan jos ollaan clientti
        struct sockaddr_in service;
        DWORD AutoId;
        HANDLE HAuto;
    public:
        SOCKET Socket; //soketti
        bool Connection(); //palauttaa ollaanko yhteydessä
        bool ToClient(); //clientiksi
        bool ToServer(); //serveriksi
        bool IsServer(){ return server; }
        char* GetLocalIp(); //oman koneen ip
        bool InitSocket(); //alustaa soketin
        bool InitAll(); //alustaa kaiken
        bool SetIp(const char *Pip); //asettaa ip jonne konnektaudutaan
        bool SetPort(u_short Pport); //asettaa portin jonne konnektaudutaan
        u_short GetPort(); //palauttaa portin
        char* GetIp(); //palauttaa oman iipeen
        char* GetBuddysIp(); //palauttaa kaverin iipeen
        bool Connect(bool autoreconnect); //ottaa yhteydem
        bool Close(); //sulkee yhteyden kokonaan
        bool Disconnect(); //sulkee yhteyden
        bool Send(const char* data); //lähettää dataa
        bool GetData(char* data, int maxlength); //vastaanottaa dataa
        bool CleanAll(); //putsaa kaiken
        Winsocket(); //konstruktori
};
bool InitWinsock();
bool CleanWinsock();
DWORD WINAPI AutoReConnect(LPVOID lpParam); //autojoinaussäie
#endifWinsocket.cpp
#include "winsocket.h"
#include <iostream>
using namespace std;
Winsocket::Winsocket(){ //konstruktori
    yhteys = false; //ei olla yhteydessä
    server = true; //ollaan serveri oletuksena
}
bool Winsocket::Connection(){
    return yhteys;
}
bool Winsocket::ToClient(){
    Close(); //suljetaan yhteys ettei lennossa mennä säätelemään asetuksia
    server = false; //clientiksi
    return false;
}
bool Winsocket::ToServer(){
    Close(); //suljetaan yhteys ettei lennossa mennä säätelemään asetuksia
    server = true; //serveriksi
    return false;
}
bool Winsocket::InitSocket(){
    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //tehään soketti
    if(Socket == INVALID_SOCKET) {   //jos jokin meni pielee
        MessageBox(NULL, "Soketti ei alustu!", "Erhe!", 0);
        Disconnect(); //putsataa
        return true; //palautetaan erisuuri kuin 0
    }
    return false; //onnistuttiin
}
bool Winsocket::InitAll(){
    if(InitWinsock() == true && InitSocket() == true) return true;
    return false;
}
bool Winsocket::SetIp(const char *Pip){
    strcpy(ip, Pip);
    return false;
}
bool Winsocket::SetPort(u_short Pport){
    port = Pport;
    return false;
}
bool Winsocket::Connect(bool autoreconnect){
    if(server == true){
        service.sin_family = AF_INET;
        service.sin_port = htons(port);
        service.sin_addr.s_addr = INADDR_ANY;
        if (bind(Socket, (SOCKADDR*) &service,sizeof(service)) == SOCKET_ERROR){
            yhteys = false;
            Disconnect();
            cout << "Bindaus meni mönkään!" << WSAGetLastError() << "\n";
        }
        if (listen(Socket, 1 ) == SOCKET_ERROR ){
           yhteys = false;
           Disconnect();
           cout << "Kuuntelu meni mönkään!" << WSAGetLastError() << "\n";
        }
        else yhteys = true;
        SOCKET AcceptSocket;
        AcceptSocket = SOCKET_ERROR;
        while (AcceptSocket == SOCKET_ERROR){
            AcceptSocket = accept(Socket, NULL, NULL );
            if(yhteys == false)break;
        }
        Socket = AcceptSocket;
    }
    else {
        service.sin_family = AF_INET;
        service.sin_port = htons(port);
        service.sin_addr.s_addr = inet_addr(ip);
        if (connect(Socket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR){
            cout << "Connecti meni mönkään! " << WSAGetLastError() << "\n";
            Disconnect();
            yhteys = false;
        }
        else {
            yhteys = true;
        }
    }
    if(autoreconnect) HAuto = CreateThread(0, 0, AutoReConnect, (LPVOID)this, 0, &AutoId);
    return !yhteys;
}
bool Winsocket::Close(){
    TerminateThread(HAuto, AutoId);
    closesocket(Socket);
    yhteys = false;
    return false;
}
bool Winsocket::Disconnect(){
    closesocket(Socket);
    yhteys = false;
    return false;
}
bool Winsocket::Send(const char* data){
    if(yhteys == true)send(Socket, data, strlen(data), 0);
    else {
        Disconnect();
        cout << "Ei yhteyttä, dataa ei voitu lähettää " << WSAGetLastError() << "\n";
        return true;
    }
    return false;
}
bool Winsocket::GetData(char* data, int maxlength){
    if(yhteys == true){
        int ret = recv(Socket, data, maxlength, 0);
        if(Socket == INVALID_SOCKET || ret == 0 || ret == -1){
            cout << "Data ei tullu " << WSAGetLastError() << " \n";
            data[0] = '\0';
            Disconnect();
            return true;
        }
    } else {
        cout << "Ei voitu vastaanottaa dataa, ei yhteyttä! " << WSAGetLastError() << "\n";
        Disconnect();
        return true;
    }
    return false;
}
/*ip-jutut poistettu*/
bool Winsocket::CleanAll(){
    Close();
    CleanWinsock();
    return false;
}
u_short Winsocket::GetPort(){
    return port;
}
char * Winsocket::GetIp(){
    return ip;
}
bool CleanWinsock(){
    WSACleanup();
    return false;
}
bool InitWinsock(){
    WSADATA Wsadata;
    if(WSAStartup( MAKEWORD(2,2), &Wsadata ) != NO_ERROR){ //tapahtui virhe
        cout << "Winsock ei alustunut! " << WSAGetLastError() << "\n";
        CleanWinsock();
        return true; //palautetaan erisuuri kuin 0 koska tapahtui virhe
    }
    return false; //palautetaan 0 koska onnistuttiin
}
DWORD WINAPI AutoReConnect(LPVOID lpParam){
    Winsocket *wsocket = (Winsocket*)lpParam;
    while(1){
        if(!InternetGetConnectedState(NULL, 0)){ //ollaanko netissä
            wsocket->Disconnect();
            Sleep(10);
        }
        if(wsocket->Connection() == false){
            if(wsocket->InitSocket() == true) cout << "autorekonnektin initsocket epäonnistu :(\n";
            if(!wsocket->Connect(false))cout << "jee rekonnekt toimii\n";
        }
        Sleep(1000);
    }
}Server.cpp
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "winsocket.h"
using namespace std;
int main(int argc, char *argv[])
{
    char data[100] = "";
    InitWinsock();
    Winsocket* SSocket = new Winsocket;
    SSocket->SetPort(7576);
    SSocket->ToServer();
    SSocket->InitSocket();
    if(!SSocket->Connect(true))cout << "jee yhteys\n";
    while(1){
        if(SSocket->Connection()){
            SSocket->GetData(data, 100);
            cout << data << "\n";
            Sleep(1000);
            SSocket->Send("Terveiset serveriltä");
            Sleep(1000);
        }
        Sleep(10);
    }
    return EXIT_SUCCESS;
}Client.cpp
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "winsocket.h"
using namespace std;
int main(int argc, char *argv[])
{
    char data[100] = "";
    InitWinsock();
    Winsocket* CSocket = new Winsocket;
    CSocket->SetPort(7576);
    CSocket->SetIp("91.152.182.144");
    CSocket->ToClient();
    CSocket->InitSocket();
    if(CSocket->Connect(true))cout << "jee yhteys\n";
    while(1){
        if(CSocket->Connection()){
            CSocket->Send("asd");
            Sleep(1000);
            CSocket->GetData(data, 100);
            cout << data << "\n";
            Sleep(1000);
        }
        Sleep(10);
    }
    return EXIT_SUCCESS;
}Joo.. Toivottavasti joku nyt jaksaa lukea tän, ja auttaa..
Aihe on jo aika vanha, joten et voi enää vastata siihen.