C++ не передает данные через сокеты

Проблема в следующем - есть сервер и клиент, посылаем данные через сокеты. Если я например запущу сервер и клиент на одном компьютере, то все хорошо, но если я запущу сервер на одном компьютере, а клиент на другом в этой же сети, то ответ я тоже принимаю и отправляю данные, но принимаемые мною данные равны 0, хотя в отладчике со стороны сервера там все хорошо

Client

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "Winsock2.h"
#include <iostream>
#include <windows.h>
#include <string>
#include <ctime>
#pragma comment(lib, "WS2_32.lib")

using namespace std;

struct GETSINCHRO
{
    string cmd;
    int curvalue;
};

struct SETSINCHRO
{
    string cmd;
    int correction;
};

int main()
{
    setlocale(LC_CTYPE, "Russian");

    string IP = "127.0.0.1";

    int Tc = 1000;
    int Cc = 0;

    SYSTEMTIME tm;
    SYSTEMTIME localtm;
    GETSINCHRO getsincro;
    SETSINCHRO setsincro;
    ZeroMemory(&setsincro, sizeof(setsincro));
    ZeroMemory(&getsincro, sizeof(getsincro));
    getsincro.cmd = "SINC";
    getsincro.curvalue = 0;


    cout << "Клиент запущен" << endl;

    try
    {
        SOCKET cS;
        WSADATA wsaData;

        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            throw SetErrorMsgText("Startup: ", WSAGetLastError());

        if ((cS = socket(AF_INET, SOCK_DGRAM, NULL)) == INVALID_SOCKET)
            throw SetErrorMsgText("Socket: ", WSAGetLastError());

        SOCKADDR_IN serv;
        serv.sin_family = AF_INET;
        serv.sin_port = htons(2000);
        serv.sin_addr.s_addr = inet_addr(IP.c_str());
        int avgcorr = 0;
        int lensockaddr = sizeof(serv);
        sendto(cS, (char*)&getsincro, sizeof(getsincro), 0, (sockaddr*)&serv, sizeof(serv));
        recvfrom(cS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&serv, &lensockaddr);
        getsincro.curvalue += setsincro.correction;

        int  tick_number = 1;
        while (tick_number < 11)
        {
            GetSystemTime(&tm);
            TIME_ZONE_INFORMATION tzInfo;
            GetTimeZoneInformation(&tzInfo);
            SystemTimeToTzSpecificLocalTime(&tzInfo, &tm, &localtm);
            sendto(cS, (char*)&getsincro, sizeof(getsincro), 0, (sockaddr*)&serv, sizeof(serv));
            recvfrom(cS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&serv, &lensockaddr);

            Cc += Tc;

            cout << " Date and time " << localtm.wMonth << "/" << localtm.wDay << "/" << localtm.wYear << " " << endl
                << localtm.wHour << " Hours " << localtm.wMinute << " Minutes " << localtm.wSecond << " Seconds " << localtm.wMilliseconds
                << " Milliseconds " << endl << tick_number++ << " " << getsincro.curvalue 
                << " Correction = " << setsincro.correction << endl;


            Sleep(Tc);
        }

    }
    catch (string errorMsgText)
    {
        cout << endl << errorMsgText << endl;
    }
    system("pause");

    return 0;
}

Server

#include <iostream>
#include "Winsock2.h"
#include "ws2tcpip.h"
#include "string.h"
#include "locale"
#include "time.h"
#include "numeric"
#include <windows.h>
#include "ServerU.h"

#pragma comment(lib, "WS2_32.lib")

using namespace std;


struct SETSINCRO
{
    string cmd;
    int correction;
};

struct GETSINCRO
{
    string cmd;
    int curvalue;
};


int setAverageCorrection(int averageCorrection[], int length)
{
    return std::accumulate(averageCorrection, averageCorrection + length, 0);
}

int main()
{
    setlocale(LC_ALL, "Russian");

    SETSINCRO setsincro;
    GETSINCRO getsincro;
    ZeroMemory(&setsincro, sizeof(setsincro));
    ZeroMemory(&getsincro, sizeof(getsincro));

    setsincro.cmd = "SINCRO";
    setsincro.correction = 0;
    SYSTEMTIME tm;
    SYSTEMTIME localtm;


    cout << "Сервер запущен" << endl;

    try
    {
        SOCKET sS;
        WSADATA wsaData;


        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            throw SetErrorMsgText("Startup: ", WSAGetLastError());

        if ((sS = socket(AF_INET, SOCK_DGRAM, NULL)) == INVALID_SOCKET)
            throw SetErrorMsgText("Socket: ", WSAGetLastError());

        SOCKADDR_IN serv;
        serv.sin_family = AF_INET;
        serv.sin_port = htons(2000);
        serv.sin_addr.s_addr = INADDR_ANY;

        if (bind(sS, (LPSOCKADDR)&serv, sizeof(serv)) == SOCKET_ERROR)
            throw SetErrorMsgText("Bind_Server: ", WSAGetLastError());

        int count = 1;

        while (true)
        {
            SOCKADDR_IN client;
            int lc = sizeof(client);
            int average = 0;
            GetSystemTime(&tm);
            TIME_ZONE_INFORMATION tzInfo;
            GetTimeZoneInformation(&tzInfo);
            SystemTimeToTzSpecificLocalTime(&tzInfo, &tm, &localtm);
            recvfrom(sS, (char*)&getsincro, sizeof(getsincro), NULL, (sockaddr*)&client, &lc);
            c = clock();
            setsincro.correction = c - getsincro.curvalue;
            averageCorrection[count - 1] = setsincro.correction;
            average = setAverageCorrection(averageCorrection, count);
            sendto(sS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&client, sizeof(client));


            char clientIp[INET_ADDRSTRLEN];
            inet_ntop(AF_INET, &(client.sin_addr), clientIp, INET_ADDRSTRLEN);
            cout << endl << count << "." << " Date and time " << localtm.wMonth << "/" << localtm.wDay << "/" << localtm.wYear//
                << " " << endl << localtm.wHour << " Hours " << localtm.wMinute << " Minutes " << localtm.wSecond//
                << " Seconds " << localtm.wMilliseconds << " Milliseconds " << endl << "Correction = " << setsincro.correction//
                << ", Average correction = " << average << endl;//
            cout << "Client's address " << clientIp << endl;//

            count++;
        }

    }
    catch (string errorMsgText)
    {
        cout << endl << errorMsgText;
    }

    return 0;
}

Ответы (1 шт):

Автор решения: CriticalError

Необходимо заменить string на char []. Затем перед отправкой структуры использовать strcpy() с нужной строкой.

→ Ссылка