Ответ на первый вопрос, если вы хотите перейти к нижней части.
Я разрабатываю связь между КПК на .net 2.0 и нашими серверами. Не могу использовать WCF, иначе я бы это сделал.
Модель связи выглядит следующим образом:
И, к счастью, я нашел рабочую кодовую форму 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, и у меня возникают проблемы с отладкой. Нельзя использовать обычные точки отладки в коде - вместо этого я прибегнул к созданию формы для отображения.
Какие-либо советы по отладке DLL-файлов?
Я все еще довольно новичок в C #; только на 1 год.
ТИА
Andrew