System.Net.Sockets.Исключение SocketException (0x80004005) при подключении C #-клиента к серверу C

#c# #sockets #xamarin #tcpclient

#c# #сокеты #xamarin #tcpclient

Вопрос:

Я хочу инициировать TCP-соединение между моим Android-смартфоном и моим компьютером Win10. У меня запущен сервер C , который можно легко подключить к другим клиентам C . Мой клиент C # на Xamarin выдает следующее исключение:

{System.Net.Sockets.Исключение SocketException (0x80004005): отказано в подключении
к System.Net.Sockets.Сокет.Подключитесь (System.Net.EndPoint remoteEP) [0x000b6] в:0 в
AndroidSocketClient.MainActivity.Подключаемый сервер (System.Отправитель объекта, система.EventArgs e) [0x00039]

Сервер C

 #include<io.h>
#include<stdio.h>
#include <string>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc, char* argv[])
{
    WSADATA wsa;
    SOCKET s, new_socket;
    struct sockaddr_in server, client;
    int c;

    printf("nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2), amp;wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        return 1;
    }

    printf("Initialised.n");

    //Create a socket
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d", WSAGetLastError());
    }

    printf("Socket created.n");

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons(27015);

    //Bind
    if (bind(s, (struct sockaddr*) amp; server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d", WSAGetLastError());
    }

    puts("Bind done");

    //Listen to incoming connections
    listen(s, 3);

    //Accept and incoming connection
    puts("Waiting for incoming connections...");

    c = sizeof(struct sockaddr_in);
    new_socket = accept(s, (struct sockaddr*) amp; client, amp;c);
    if (new_socket == INVALID_SOCKET)
    {
        printf("accept failed with error code : %d", WSAGetLastError());
    }

    puts("Connection accepted");

    //Reply to client
    const char* message = "Hello Client , I have received your connection. But I have to go now, byen";
    send(new_socket, message, strlen(message), 0);

    getchar();

    closesocket(s);
    WSACleanup();

    return 0;
}
  

C #-клиент

 public void ConnectServer(object sender, System.EventArgs e)
{
    byte[] data = new byte[10];

    IPHostEntry iphostInfo = Dns.GetHostEntry(Dns.GetHostName());
    IPAddress ipAdress = iphostInfo.AddressList[0];
    IPEndPoint ipEndpoint = new IPEndPoint(ipAdress, 27015);

    Socket client = new Socket(ipAdress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

    try
    {
        client.Connect(ipEndpoint);
        Console.WriteLine("Socket created to {0}", client.RemoteEndPoint.ToString());

        while (true)
        {
            string message = "Test";
            byte[] sendmsg = Encoding.ASCII.GetBytes(message);
            int n = client.Send(sendmsg);
        }
    }
    catch (Exception ex)
    {
        Toast.MakeText(this, ex.ToString(), ToastLength.Short).Show();
    }

    Console.WriteLine("Transmission end.");
}
  

Проверенные решения:

Я уже пытался отключить брандмауэр и разрешить подключение к Интернету.

 uses-permission android:name="android.permission.INTERNET"
  

Комментарии:

1. Вы пытаетесь подключиться к себе, а не к своему серверу.

2. Запущен ли сервер? Исключение, которое вы получаете, произойдет при двух условиях: 1) Сервер не запущен. или у вас нет маршрута к серверу. Используйте Ping для проверки соединения с cmd.exe . попробуйте использовать как IP-адрес сервера, так и имя компьютера. 2) Существует другое приложение, уже подключенное к тому же серверу с использованием того же порта. Вы можете проверить из cmd.exe для проверки состояния TCP используйте следующее: > Netstat -a

3. @GSerg Не могли бы вы уточнить это для меня?

4. Клиентская программа, которую вы запускаете на своем телефоне, пытается подключиться к серверу на том же телефоне. Вы сказали, что сервер находится на настольном компьютере Win10. Он не пытается подключиться к этому. Как вы думаете Dns.GetHostEntry(Dns.GetHostName()) , что делает?

5. Блин! Изменил Dns.GetHostName() на имя компьютера, теперь он работает. Спасибо.