отладка сокетов и DLL - PullRequest
       39

отладка сокетов и DLL

1 голос
/ 20 января 2012

Ответ на первый вопрос, если вы хотите перейти к нижней части.

Я разрабатываю связь между КПК на .net 2.0 и нашими серверами. Не могу использовать WCF, иначе я бы это сделал.

Модель связи выглядит следующим образом:

Comms Model И, к счастью, я нашел рабочую кодовую форму http://aviadezra.blogspot.com/2008/07/code-sample-net-sockets-multiple.html - отсюда и вышеприведенное изображение.

В примере приложения есть сообщения от каждого клиента, передаваемые всем остальным клиентам. Я хотел бы иметь возможность отправить сообщение от одного клиента другому конкретному клиенту. Чтобы сделать это, я изменил клиентское приложение, чтобы иметь from-ID и To-ID, которые отправляются как часть сообщения.

Примечание: на этом этапе я делаю подтверждение концепции - я буду работать над такими вещами, как заголовки сообщений (длины, версии и т. Д. Позже).

Из проекта каждое клиентское соединение обрабатывается:

private void OnClientConnection(IAsyncResult asyn)
    {
        if (m_Closed)
        {
            return;
        }

        try
        {
            Socket clientSocket = m_socket.EndAccept(asyn);

            RaiseClientConnected(clientSocket);

            ConnectedClient connectedClient = new ConnectedClient(clientSocket);

            connectedClient.MessageRecived += OnMessageRecived;
            connectedClient.Disconnected += OnClientDisconnection;

            connectedClient.StartListen();

            long key = clientSocket.Handle.ToInt64();
            if (m_clients.ContainsKey(key))
            {
                Debug.Fail(string.Format(
                    "Client with handle key '{0}' already exist!", key));
            }

            m_clients[key] = connectedClient;

            // create the call back for any client connections...
            m_socket.BeginAccept(new AsyncCallback(OnClientConnection), null);

        }
        catch (ObjectDisposedException odex)
        {
            Debug.Fail(odex.ToString(),
                "OnClientConnection: Socket has been closed");
        }
        catch (Exception sex)
        {
            Debug.Fail(sex.ToString(), 
                "OnClientConnection: Socket failed");
        }

    }

Класс connectedClient содержит сокет для этого клиента.

Когда я отправляю сообщение от клиента, я проверяю, есть ли это в моем списке сокетов:

if (ListIDSocket.ContainsKey(ToID))
{
    PublishMessage(listLog, "ToID Found");
    SendAll = false;
}

ListIDSocket - это:

private Dictionary<string, Socket> ListIDSocket = new Dictionary<string, Socket>();

Тогда ..

if (SendAll)
   m_ServerTerminal.DistributeMessage(buffer);
else
  m_ServerTerminal.SendToSocket(ToID, socket, buffer);

Так что, если сообщение кому-либо, вызовите DistributeMessage; если для одного пользователя, позвоните SendToSocket.

Код в m_ServerTerminal:

public void DistributeMessage(byte[] buffer)
{
    try
    {
        foreach (ConnectedClient connectedClient in m_clients.Values)
        {
            connectedClient.Send(buffer);
        }
    }
    catch (SocketException se)
    {
        Debug.Fail(se.ToString(), string.Format(
            "Buffer could not be sent"));
    }
}

public void SendToSocket(string ToID, Socket DestSocket, byte[] buffer)
{
    DistributeMessage(buffer);   // This line works
    ConnectedClient ToClient;
    long keyval = DestSocket.Handle.ToInt64();

    if (m_clients.ContainsKey(keyval))
    {
        ToClient = (ConnectedClient)m_clients[keyval];
        try
        {
            ToClient.Send(buffer);      // Nothing is received
        }
        catch (SocketException se)
        {
            Debug.Fail(se.ToString(), se.Message);
        }

        // DistributeMessage(buffer);    // This code here doesn't work
    }
}

DistributeMessage работает нормально. В целях отладки я включил вызов DistributeMessage в свой SendToSocket, и он работает, если он находится сверху.

Если я переместу его вниз после попытки записи в сокет, это не так.

Я не получаю исключения в любом случае.

В нынешнем виде клиент получает одно сообщение, когда ему нужно получить два - одно от DistributeMessage и одно от SendToSocket.

Код для подключенного клиента. Отправка:

public void Send(byte[] buffer)
{
   if (m_clientSocket == null)
   {
       throw new Exception("Can't send data. ConnectedClient is Closed!");
   }
   m_clientSocket.Send(buffer);

}

Вопросы:

Я не вижу ничего, что я делаю, существенно изменив свой новый код с существующим, но сокет не записывается. Кто-нибудь может заметить что-нибудь очевидное? Это как-то связано с сокетами, дескрипторами и ссылками на них?

РЕДАКТИРОВАТЬ: ошибка обнаружена, пока я смотрел вверх, чтобы увидеть, существует ли сокет, я передавал в сокет отправителя, а не получателя. Я исправлю это. Отладка DLL, о которой я все еще хотел бы знать ..

Во-вторых, проект настроен на обработку сокетов в своей собственной DLL-библиотеке Communication.Sockets.Core. Я никогда раньше не создавал DLL, и у меня возникают проблемы с отладкой. Нельзя использовать обычные точки отладки в коде - вместо этого я прибегнул к созданию формы для отображения.

Solution Explorer

Какие-либо советы по отладке DLL-файлов?

Я все еще довольно новичок в C #; только на 1 год.

ТИА

Andrew

...