Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
5

Witam

Piszę aplikacje klient - server przy użyciu socketów TCP/IP. (C# .net 3.5)

Server:

TcpListener tcpListner = new TcpListener(addr,portNb);
tcpListner.Start();
while (true)
{
  Socket clientSocket = tcpListner.AcceptSocket();
  if(BrakNaLiscie(clientSocket))//ten adres IP nie jest mi znany
    clientSocket.Close();
  else
    Obsluz(clientSocket)//obsługuje klienta
}

Klient

TcpClient tcpClient = new TcpClient(serverIP, serverPort);
NetworkStream ns = tcpClient.GetStream();
ns.Write(sendBytes, 0, sendBytes.Length);

Jak mogę się dowiedzieć z pozycji klienta czy mój wysłany bufor nie poszedł w próżnie? Czy klient został zamknięty czy obsłużony? Mam przyzwyczajenia z Borland C++ że połączenie TCP/IP było najpierw zestawiane, a później odbywała się komunikacja, wydaje mi się że w .net jest zupełnie inaczej, że połączenie można zestawiać każdorazowo przed wysłaniem ramki, czy mam racje?

flag

4 Answers

0

Zauwazylem, ze jestes ta sama osoba, ktora napisala post o watkach i timerach.

W System.Timers.Timer, jesli wyjatek wysetpuje w zdarzeniu Elapsed, jest duszony i nie wypuszczany na zewnatrz. Dlatego moze Ci sie wydawac, ze nie leci, pomimo tego, ze w rzeczywistosci leci ;)

Cytat:

In the .NET Framework version 2.0 and earlier, the Timer component catches and suppresses all exceptions thrown by event handlers for the Elapsed event. This behavior is subject to change in future releases of the .NET Framework.

Zrodlo: System.Timers.Timer

Moze tutaj lezy Twoj problem?

EDIT:

Wywolaj Socket.Shutdown(SocketShutdown.Both); zanim wywolasz Close();

link|flag
W moim przypadku jest v 3.5 i tu nie korzystam z timera (ani wątku) po prostu wywołuje funkcję write. Wiec to nie będzie to. – Wiewiurczak Mar 13 at 11:30
1

Dokumentacja mówi:

The Write method blocks until the requested number of bytes is sent or a SocketException is thrown. If you receive a SocketException, use the SocketException..::.ErrorCode property to obtain the specific error code, and refer to the Windows Sockets version 2 API error code documentation in MSDN for a detailed description of the error.

Sprawdzałeś czy wyjątek SocketException jest rzucany?

link|flag
Tak jak pisałem wyżej - wyjątek nie jest wyrzucany. Być może jest tak, że bufor zdąży się przesłać do serwera zanim wykona się Close(). Wtedy mimo, że serwer nie odebrał danych uznaje, że operacja była poprawna. – Wiewiurczak Mar 13 at 7:01
1

Nie ma jakiegoś eventu, OnError, OnConnectionClosed lub coś podobnego?

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketexception.aspx Ale jak żadnego wyjątku nie wypluwa to może być problem

link|flag
1

Zgodnie z dokumentacją: jeśli coś pójdzie nie tak gdy wywołujesz metodę Write(), zostanie rzucony wyjątek System.IO.IOException.

Nie, nie zestawia się połączenia za każdym wysłaniem ramki.

link|flag
Niestety nie wypluwa wyjątku. – Wiewiurczak Mar 11 at 17:34

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.