如果你想跳到最底层,现在回答第一个问题..
我正在开发.net 2.0和我们服务器上的PDA之间的通信。不能使用WCF或我会。
comms模型是这样的:
幸运的是,我找到了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");
}
}
Class 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工作正常。出于调试目的,我在SendToSocket中包含了对DistributeMessage的调用,如果它位于顶部,则可以正常工作。
如果我在尝试写入套接字后将其向下移动,则不会。
我在任何一种方式都没有例外。
现在看来,客户端收到两条消息时会收到一条消息 - 一条来自DistributeMessage,另一条来自SendToSocket。
connectedclient.Send的代码是:
public void Send(byte[] buffer)
{
if (m_clientSocket == null)
{
throw new Exception("Can't send data. ConnectedClient is Closed!");
}
m_clientSocket.Send(buffer);
}
问题:
我看不到任何与我现有的新代码有很大不同但是套接字没有被写入的东西。谁能发现任何明显的东西?这与套接字,句柄和对它们的引用有关吗?
编辑:找到了Bug,当我抬头看看套接字是否存在时,我正在传递发送器的套接字而不是接收器。我会解决这个问题。 调试DLL我仍然想知道..其次,项目设置为在其自己的DLL中使用套接字处理,名为Communication.Sockets.Core。我以前从未构建过DLL,而且调试时遇到问题。无法在代码中使用正常的调试点 - 我使用创建表单来代替显示。
有关如何调试DLL的任何提示?
我还是C#的新手;仅仅1年。
TIA,
安德鲁