Потеря соединения с сокетом после функции «Socket.Receive» - PullRequest
0 голосов
/ 21 июня 2019

У меня есть клиент ac #.Задача клиента - войти на сервер.

Проблема в том, что: когда я хочу войти, я использую сокет TCP, который создается при инициализации окна "wpf".После однократной отправки данных через сокет все в порядке, но когда я хочу снова отправить данные через тот же сокет, появляется следующее исключение:

System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту.Имя объекта: 'System.Net.Sockets.Socket'. '

После некоторого тестирования я обнаружил, что проблема вызвана функцией Socket.Receive.Я проверил сокет перед вызовом функции, и сокет был подключен (Socket.Connected == true), после возврата из функции сокет не был подключен (Socket.Connected == false)

private static Socket ConnectSocket(string server, int port)
{
Socket s = null;
// Get host related information.
IPHostEntry hostEntry = Dns.GetHostEntry(server);

// Loop through the AddressList to obtain the supported AddressFamily.
foreach (IPAddress address in hostEntry.AddressList)
{       
    //attempting to connect.
    IPEndPoint ipe = new IPEndPoint(address, port);
            //making a temp socket to check the connection (if something went wronge/ the server isnt active)
            Socket tempSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    try
    {
        // attempting connection.
        tempSocket.Connect(ipe);
            }
            catch (Exception)
            {
                Console.WriteLine("Request timed out");
            }

            //if we connected to the server, we are ok to continue.
            if (tempSocket.Connected)
            {
                s = tempSocket;
                break;
            }
            //else the connection isnt successful (the server might not respond) we need to try again.
            else
            {
                continue;
            }
}
Globals.SOCKET = s;
return s;
}

//This func will send a request to the server and returns the server's response.
public static string SocketSendReceive(string server, int port, string request, Socket socket = null)
{
    Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
    Byte[] bytesReceived = new Byte[256];
    string response = "";
    // Create a socket connection with the specified server and port.
    if (socket == null)
        socket = ConnectSocket(server, port);
    using (socket)
    {
        // If the connection faild and couldnt maintain a socket.
               if (socket.Connected == false)
            return ("Connection failed");

        // Send request to the server.
        socket.Send(bytesSent, bytesSent.Length, 0);

                // Receiving the packet from the server.
                int bytes = socket.Receive(bytesReceived, bytesReceived.Length,0);//***The problem occures Here***
               response = response + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
    }
    return response;
}

вторая функция - это та, которая отправляет и получает данные с сервера.первый просто соединяет и создает сокет

Спасибо за вашу помощь!-Anthon

1 Ответ

0 голосов
/ 24 июня 2019

Изменение

socket.Receive (bytesReceived, bytesReceived.Length, 0)

К

socket.Receive (bytesReceived, 0, bytesReceived.Length)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...