Как подключиться C# клиентом к C++ серверу с помощью Socket?

Пояснение

Я не профессионал в C++, но благодаря документации смог собрать сервер и клиент на C++ (все коды ниже). Однако у проекта возникла необходимость переписать код клиента с cpp на cs. Я написал код клиента на cs, но он не способен установить подключение. Ошибка: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение.


Код сервера:

// Подключение C++ заголовков;
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

// Подключение самописных заголовков;
#include "mServer.h"    

// Main
int main() {
    
    // Объект WSADATA;
    WSADATA wsaData;
    
    // Инициализация WSA;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    
    // Проверка инициализации WSA;
    if (iResult != 0) {
        
        // При наличии ошибки выводим информацию об ошибке;
        printf("WSAStartup failed: %d\n", iResult);
        system("pause");
        return 1;
        
    }
    
    // Создание структуры addrinfo;
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    
    ZeroMemory(&hints, sizeof(hints));
    
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    
    // Получение информации по заданному адресу;
    iResult = getaddrinfo(NULL, mServer::portDefault, &hints, &result);
    
    // Проверка адреса
    if (iResult != 0) {
        
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        system("pause");
        return 1;
        
    }
    
    // Создание объекта Socket-а;
    SOCKET ListenSocket = INVALID_SOCKET;
    
    // Делает созданный Socket сокетом прослушивания;
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
    // Проверка Socket-а;
    if (ListenSocket == INVALID_SOCKET) {
        
        printf("Error at socket(): %ld\n", WSAGetLastError());
        printf(mServer::portDefault);
        freeaddrinfo(result);
        WSACleanup();
        system("pause");
        return 1;
        
    }
    
    // Привязка Socket-а к адресу;
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    
    // Проверка привязки Socket-а к адресу;
    if (iResult == SOCKET_ERROR) {
        
        printf("bind failed with error: %d\n", WSAGetLastError());
        
        // Высвобождение памяти, выделенной для сведений об адресах;
        freeaddrinfo(result);
        
        closesocket(ListenSocket);
        WSACleanup();
        system("pause");
        return 1;
        
    }
    
    // Прослушивание Socket-a;
    if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
        
        printf( "Listen failed with error: %ld\n", WSAGetLastError() );
        closesocket(ListenSocket);
        WSACleanup();
        system("pause");
        return 1;
        
    }
    
    // Создание объекта (Socket-а) клиентского соединения;
    SOCKET ClientSocket = INVALID_SOCKET;
    
    // Принятие запроса клиента к серверу;
    ClientSocket = accept(ListenSocket, NULL, NULL);
    
    // Проверка запроса;
    if (ClientSocket == INVALID_SOCKET) {
        
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        system("pause");
        return 1;
        
    }
    
    // Получение и отправка данных на сервере;
    
    char recvbuf[mServer::bufferLengthDefault];
    int iSendResult;
    int recvbuflen = mServer::bufferLengthDefault;
    
    do {
        
        sleep(1);
        printf("Соединение установлено!");
        
    } while(true);
    
    // Отключение сервера;
    iResult = shutdown(ClientSocket,SD_SEND);
    
    if (iResult == SOCKET_ERROR) {
        
        printf("shutdown failed: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
        
    }
    
    closesocket(ClientSocket);
    WSACleanup();
    
    system("pause");
    
    return 0;
    
}

Код подключения клиента:

Socket socket = null;
            IPHostEntry iPHostEntry = null;

            iPHostEntry = Dns.GetHostEntry(this.addres);

            foreach (IPAddress address in iPHostEntry.AddressList)
            {

                IPEndPoint iPEndPoint = new IPEndPoint(address, this.port);

                Socket tempSocket = new Socket(iPEndPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp);

                tempSocket.Connect(iPEndPoint);

                if (tempSocket.Connected)
                {
                    socket = tempSocket;
                    break;
                }
                else
                {
                    continue;
                }

            }
            this.socket = socket;

Код клиента через TcpClient


TcpClient client = new TcpClient();
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8005));


Дополнительные пояснения:

  • Порт: 8005;
  • адрес: localhost:127.0.0.1;

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