Я применил свое Серверное приложение относительно этого поста здесь: http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c8781#Client1
Подводя итог: я использую асинхронные сокеты аля BeginAccept (..), BeginReceive (..).
Мой сервер способен обрабатывать несколько клиентов, и все работает нормально, пока клиент не выполнит две или более синхронных операции отправки, не ожидая некоторое время. Клиент не получает никакой ошибки и поэтому не уведомляется, что сервер не получает второе сообщение! Если клиент ждет ок. Через 100 мс после первой операции отправки все работает нормально.
Я думал, что когда я использую TCP, я могу гарантировать, что сервер получит сообщение. (За исключением того, что есть исключение)!
Не могли бы вы предоставить мне решение, чтобы исправить это.
Вот методы WaitForData (..) и OnDataReceive (..), которые я реализовал на сервере
public void WaitForData(MyClient client)
{
try
{
if (pfnCallBack == null)
{
pfnCallBack = new AsyncCallback(OnDataReceived);
}
iarResult = client.Socket.BeginReceive(client.DataBuffer,
0, client.DataBuffer.Length,
SocketFlags.None,
pfnCallBack,
client);
}
catch (SocketException se)
{
MessageBox.Show("SocketException@WaitForData" + se.Message);
}
}
public void OnDataReceived(IAsyncResult asyn)
{
try
{
MyClient user= (MyClient)asyn.AsyncState;
int iRx = user.Socket.EndReceive(asyn);
byte[] receivedData = user.DataBuffer;
MemoryStream memStream = new MemoryStream();
BinaryFormatter binForm = new BinaryFormatter();
memStream.Write(receivedData, 0, receivedData.Length);
memStream.Seek(0, SeekOrigin.Begin);
MyMessage msg = (MyMessage)binForm.Deserialize(memStream);
switch (msg.Command)
{
case (MyMessage.MyCommand.ConnId):
this.connId = (int) msg.MyObject;
tsslConnStatus.Text += " | ID: " + connId.ToString();
break;
case (MyMessage.MyCommand.Text):
MessageBox.Show(msg.MyObject.ToString());
break;
}
WaitForData(server);
}
catch (ObjectDisposedException ode)
{
MessageBox.Show("ObjectDisposedException@OnReceiveData" + ode.Message);
}
catch (SocketException se)
{
MessageBox.Show("SocketException@OnReceiveData" + se.Message);
}
}
КЛИЕНТ вызывает синхронный метод отправки дважды или более! сервер INSTANCEOF MyClient
if (server.Socket.Connected)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, message);
MyMessage = new MyMessage(something);
server.Socket.Send(ms.ToArray());
}
Итак, я думаю, что этих фрагментов кода должно быть достаточно, чтобы вы поняли идею, которую я пытался использовать!
Если вам нужна дополнительная информация или фрагменты кода, просто скажите мне, что я опубликую это!
Thanx!