код ошибки: 10053
текст: An established connection was aborted by the software in your host machine
мой код:
Socket socket = SocketUtils.ConnectSocket("10.20.6.30", 11010);
byte [] sendByte = new byte [3] {8, 0, 0};
socket.Send(sendByte);
byte [] receive = new byte[4] {0,0,0,0};
socket.Receive(receive);
Thread.Sleep(200);
socket.Send(sendByte);
socket.Receive(receive);
Если убрать Thread.Sleep(200);
то во втором вызове socket.Receive()
происходит вышеуказанная ошибка.
Кто нибудь сталкивался с похожей проблемой, Есть ли решение, помимо усыпления потока?
Спасибо.
Здравствуйте, milvic, Вы писали:
M>код ошибки: 10053 M>текст: An established connection was aborted by the software in your host machine M>мой код: M>Socket socket = SocketUtils.ConnectSocket("10.20.6.30", 11010); M>byte [] sendByte = new byte [3] {8, 0, 0}; M>socket.Send(sendByte); M>byte [] receive = new byte[4] {0,0,0,0}; M>socket.Receive(receive); M>Thread.Sleep(200); M>socket.Send(sendByte); M>socket.Receive(receive); M>Если убрать Thread.Sleep(200); M>то во втором вызове socket.Receive() M>происходит вышеуказанная ошибка. M>Кто нибудь сталкивался с похожей проблемой, Есть ли решение, помимо усыпления потока?
не наблюдал такого, хотя аналогичный код юзается довольно часто... а может у вас в коде какойнить параллельный поток делает Close() ?
Здравствуйте, Morpheus_, Вы писали:
M_>Здравствуйте, milvic, Вы писали:
M>>код ошибки: 10053 M>>текст: An established connection was aborted by the software in your host machine M>>мой код: M>>Socket socket = SocketUtils.ConnectSocket("10.20.6.30", 11010); M>>byte [] sendByte = new byte [3] {8, 0, 0}; M>>socket.Send(sendByte); M>>byte [] receive = new byte[4] {0,0,0,0}; M>>socket.Receive(receive); M>>Thread.Sleep(200); M>>socket.Send(sendByte); M>>socket.Receive(receive); M>>Если убрать Thread.Sleep(200); M>>то во втором вызове socket.Receive() M>>происходит вышеуказанная ошибка. M>>Кто нибудь сталкивался с похожей проблемой, Есть ли решение, помимо усыпления потока?
M_>не наблюдал такого, хотя аналогичный код юзается довольно часто... а может у вас в коде какойнить параллельный поток делает Close() ?
Здравствуйте, Morpheus_, Вы писали:
M_>>кстати проверьте стоит ли у вас вызов Shutdown(SocketShutdown.Both); перед Close
M_>в том числе и на серверной стороне
Могу проверить только клиентскую сторону, сервер для меня black box, считается что он без багов.
Shutdown нигде не вызываю
Здравствуйте, Morpheus_, Вы писали:
M_>>кстати проверьте стоит ли у вас вызов Shutdown(SocketShutdown.Both); перед Close
M_>в том числе и на серверной стороне
Может я сокет както криво создаю?
public static Socket ConnectSocket(string server, int port)
{
Socket s = null;
IPHostEntry hostEntry = Dns.GetHostEntry(server);
foreach (IPAddress address in hostEntry.AddressList)
{
IPEndPoint ipe = new IPEndPoint(address, port);
Socket tempSocket =
new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
tempSocket.Connect(ipe);
if (tempSocket.Connected)
{
s = tempSocket;
break;
}
else
{
continue;
}
}
return s;
}
вообщето пример взят из мздн-а, если уж там криво, то где не криво.
Здравствуйте, milvic, Вы писали:
M>Здравствуйте, Morpheus_, Вы писали:
M_>>>кстати проверьте стоит ли у вас вызов Shutdown(SocketShutdown.Both); перед Close
M_>>в том числе и на серверной стороне
M>Могу проверить только клиентскую сторону, сервер для меня black box, считается что он без багов. M>Shutdown нигде не вызываю
Здравствуйте, milvic, Вы писали:
M_>>>кстати проверьте стоит ли у вас вызов Shutdown(SocketShutdown.Both); перед Close
M_>>в том числе и на серверной стороне
M>Может я сокет както криво создаю?
M> public static Socket ConnectSocket(string server, int port) M> { M> Socket s = null; M> IPHostEntry hostEntry = Dns.GetHostEntry(server); M> foreach (IPAddress address in hostEntry.AddressList) M> { M> IPEndPoint ipe = new IPEndPoint(address, port); M> Socket tempSocket = M> new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
M> tempSocket.Connect(ipe);
M> if (tempSocket.Connected) M> { M> s = tempSocket; M> break; M> } M> else M> { M> continue; M> } M> } M> return s; M> } M>вообщето пример взят из мздн-а, если уж там криво, то где не криво.
вполне возможно что баг на сервере, особенно если сервер не тестили корректно ли он работает...
кстати после Receive следует проверить сколько байт реально прочиталось, если меньше чем нужно, то нужно вызывать еще раз Receive (чтобы дочитать оставшиеся байты (передав разумеется скорректированный offset)) и так до тех пор пока не прочитаются все байты.
Хотя в данном случае для 4 байт это наверно не актуально, проблемы возникнут если читать блок данных больше системного буфера, тогда Receive будет возвращать не весь запрошенный объем а порциями...