Как подключиться 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;