问题是这样的:有一个服务器和一个客户端,我们通过套接字发送数据。例如,如果我在一台计算机上运行服务器和客户端,那么一切都很好,但如果我在一台计算机上运行服务器,在同一个网络上的另一台计算机上运行客户端,那么我也会收到响应并发送数据,但我收到的数据是 0,尽管在服务器端的调试器中一切都很好
客户
#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;
}
服务器
#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;
}