Я реализовал этот алгоритм, и он работает, но почему-то клиент не получает данных от сервера. Когда я устанавливал в качестве локального PROXY-сервера Paros всё работало.
Вот обрезанная версия моего кода (без проверки ошибок):
#include <windows.h>
#pragma comment (lib, "ws2_32.lib")
#define MAX_CLIENTS 100
#define BUF_SIZE 65535
#define PORT_PROXY_SERVER 7500
#define PORT_GAME_SERVER 80
void main()
{
WSADATA WSAStartData; // Структура данных библиотеки сокетов
struct sockaddr_in ProxyServerSAddr;
struct sockaddr_in GameServerSAddr;
char szBuf[BUF_SIZE];
char GameServerIP[] = "88.212.221.133";
SOCKET sockProxyServer; // Сокет нашего прокси
SOCKET sockGameServer; // Сокет игрового сервера
SOCKET sockGameClient; // Сокет игрового клиента
DWORD dwBytesTransfered;
WSAStartup(MAKEWORD(1, 1), &WSAStartData);
// Запустить PROXY-сервер //
sockProxyServer = socket(AF_INET, SOCK_STREAM, 0);
ProxyServerSAddr.sin_family = AF_INET;
ProxyServerSAddr.sin_addr.s_addr =htonl(INADDR_ANY);
ProxyServerSAddr.sin_port = htons(PORT_PROXY_SERVER);
bind(sockProxyServer, (struct sockaddr *) &ProxyServerSAddr, sizeof (ProxyServerSAddr));
listen(sockProxyServer, MAX_CLIENTS);
// Дождаться подключения клиента //
sockGameClient = accept(sockProxyServer, NULL, NULL);
// Подключиться к серверу игры //
sockGameServer = socket(AF_INET, SOCK_STREAM, 0);
GameServerSAddr.sin_family = AF_INET;
GameServerSAddr.sin_addr.s_addr = inet_addr(GameServerIP);
GameServerSAddr.sin_port = htons(PORT_GAME_SERVER);
connect(sockGameServer, (struct sockaddr *) &GameServerSAddr, sizeof(GameServerSAddr));
while (1)
{
// Получить пакет от клиента //
dwBytesTransfered = recv(sockGameClient, szBuf, BUF_SIZE, 0);
// Передать пакет серверу //
dwBytesTransfered = send(sockGameServer, szBuf, dwBytesTransfered, 0);
// Получить пакет от сервера //
dwBytesTransfered = recv(sockGameServer, szBuf, BUF_SIZE, 0);
// Передать пакет клиенту //
dwBytesTransfered = send(sockGameClient, szBuf, dwBytesTransfered, 0);
}
}
---
|