prosty socket server i client

0

Witam,

proszę o pomoc. Napisałem "zaczątek" servera i clienta wykorzystując gniazda.
Załączam cały projekt i gdyby ktoś mógł odpalić i obadać...
Cel:
client ma połączyć się z gniazdem i wysłać pewną informację w postaci int`a.
server na podstawie tego id ma wykonać pewną akcję na bazie ( tego jeszcze nie ma ). Jest na razie odebranie danych i wysyłka.
Gdy server otrzyma dane wyświetlam "data send: <tutajToCoWysłałKlient>"
Nie wiem dlaczego gdy client kończy działanie na serverze mam "data sent:" i tak milion razy i rośnie :(
Cel jest aby server:

  1. wyświetlił kto się podłączył ( i to działa)
  2. jakie dane wysłał ( i to działa )
  3. wyświetlił, że klient się rozłączył ( ka bum nie działa )
0

Zapętlasz się:

void callback(IAsyncResult ar)
        {
            try
            {
                sck.EndReceive(ar);

                byte[] buf = new byte[8192];

                int rec = sck.Receive(buf, buf.Length, 0);

                if (rec < buf.Length)
                {
                    Array.Resize<byte>(ref buf, rec);
                }

                if (Received != null)
                {
                    Received(this, buf);
                }

                sck.BeginReceive(new byte[] { 0 }, 0, 0, 0, callback, null); // <-- TUTAJ
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Close();

                if (Disconnected != null)
                {
                    Disconnected(this);
                }
            }
        }
0

Dzięki DibbyDum za tip.
Próbowałem na kilka sposobów nie mogę dojść do funkcjonalności: connect, send data, disconnect.
Możesz pomóc?
I jeszcze jedno. Dodałem statyczną klasę Log, która posiada metodą zapisu do pliku.

używam jej w taki sposób

Log.save_to_log("The Client " + client.EndPoint + " -> CONNECTED", Settings.Settings.log_file); 

w dwóch miejscach ( docelowo pewnie w trzech: gdy się klient połączy, wyśle dane, rozłączy ). W tej chwili mam w dwóch 1szych i w ok. 30% przypadków dostaję komunikat o zablokowanych dostępie do pliku.

 
        public static void save_to_log(string log_message, string file_name)
        {
            using (StreamWriter w = File.AppendText(file_name))
            {
                w.WriteLine("{0} / {1}", DateTime.Now, log_message);
                w.Dispose();
            }
        }

temat zapętlenia jest priorytetowy. Co lepsze gdy dostaję brak dostępu do pliku aplikacja dochodzi do momentu rozłączenia klienta :)

0
  1. To może od najprostszych rzeczy jak używasz using Statement to pisanie Dispose() jest zbędne.
    http://msdn.microsoft.com/en-us//library/yh598w02.aspx

  2. Co do zapisu zapewne ścieżka jest C:\ coś tam... Więc albo zmień na inny dysk albo zapisuj dane w katalogu użytkownika. Żeby to minąć możesz uruchomić VS jako administrator ale podaje to tylko informacyjnie nie rób tego. ;)

  3. Co do zapętlania próbujesz pobrać kolejne dane chociaż nic więcej nie ma, musisz dodać sprawdzanie to będzie coś w stylu:

		void callback(IAsyncResult ar)
		{
			try
			{
				int read = sck.EndReceive(ar);
				if (read > 0)
				{
					// ... 
					sck.BeginReceive(new byte[] { 0 }, 0, 0, 0, callback, null);
				}
			}
			catch (Exception ex)
			{
				// ...
			}
		}

Mniej więcej coś w tym stylu zresztą w msdn masz przykład:
http://msdn.microsoft.com/en-us/library/dxkwh6zw(v=vs.110).aspx

  1. A co do rozłączania jak wyskakuje błąd z zapisem do pliku to zapewne nie obsługujesz wyjątku i Ci się program wywala dodaj do funkcji try{} catch{} i jakoś tam to obsłuż. :P
0

Dispose() - wiem ale tonący brzytwy się chwyta. Zapisuję to do katalogu gdzie uruchamiana jest aplikacja tzn. user i tam gdzie VS projekty

public static string log_file = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\log.txt"; 

Zresztą to nie jest ważne. To sobie ogarnę.
Czy masz czas aby na udostępnionym archiwum obadać ten serwerek?

0

Próbuj, kombinuj poczytaj jak ci nic nie wyjdzie to wtedy pisz. Nie ma sensu żebym na to patrzył sam musisz do tego dojść tylko wtedy cała ta zabawa ma sens. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1