Skocz do zawartości

C# i Sockety


Rekomendowane odpowiedzi

Witajcie, zacząłem bawić się z Netwokingiem w C#. No i już problemy na początku.

 

Czy da się jakoś przechwycić czyjś socket? Tak jak da się w Netwokingu w GMS lub w 39dll.

Tak wygląda mój kod przyjmujący nowe połączenie:

Socket Socket = Server.AcceptSocket();
Console.WriteLine("Nowe połaczenie o id: {0}. Ip: {1} ",i,Socket.RemoteEndPoint);

 

Utworzyłem sobie klase:

class Player
{
     public Socket sock;
};

 

Chciałem przenieś wartość z Socket do Players.sock. Niby program się kompiluje ale kiedy program już czeka na clienta i client dolącza program zawiesza się na ten o to linijce.

 

A chciałbym takie zapisywanie socketów by zrobic jakiś silnik MMO.

 

Pozdrawiam.

Odnośnik do komentarza
Udostępnij na innych stronach

class Player
{
       public string sock;
};

static void Main(string[] args)
{
       Version version = Assembly.GetExecutingAssembly().GetName().Version;
       Console.WriteLine("Wersja kompilacji: {0}",version);
           
       int i = 0;

       Player[] Players = new Player[255];


       IPAddress ip = IPAddress.Parse("127.0.0.1");
       TcpListener Server = new TcpListener(ip, 69);
       Server.Start();
       Console.WriteLine("Ip serwera:" + Server.LocalEndpoint);
       Console.WriteLine("Czekam na połączenia...");

       while(true)
       {
             i++;
             System.Threading.Thread.Sleep(5);
             Socket Socket = Server.AcceptSocket();
             Console.WriteLine("{2} dołączył. Jego id: {1} oraz Ip: {0} ", Socket.RemoteEndPoint, i, Odbierz(Socket));
             Console.WriteLine("X = {0} Y = {1}", Odbierz(Socket), Odbierz(Socket));
      } 
}


static int Wyslij(string text, Socket sock)
{
try
{
      byte[] data = Encoding.ASCII.GetBytes(text);
      sock.Send(data);
      return 1;
}
catch
{
       return 0;
}
}
static string Odbierz(Socket Socket)
{
       byte[] bajt = new byte[1024];
       int imessage = 0;
       string message = "";
       imessage = Socket.Receive(bajt);
       for (int l = 0; l < imessage; l++)
       {
            message = message + Convert.ToChar(bajt[l]);
       }


    return message;
}

Odnośnik do komentarza
Udostępnij na innych stronach

Jak wywołujesz Receive na sockecie to ta metoda czeka do tąd aż jakieś dane przyjdą.

Poszukaj sobie na google przykładów jak stworzyć asynchroniczny serwer (metody Begin[...] i End[...])

http://msdn.microsoft.com/en-us/library/fx...(v=vs.110).aspx

http://sonyarouje.com/2011/11/25/multi-cli...ous-tcp-server/

Odnośnik do komentarza
Udostępnij na innych stronach

Tak nawiasem mówiąc, to twoja zmienna ma taką samą nazwę jak klasa. Troszkę to nieczytelne, aczkolwiek poprawne.

 

A z tym przypisywaniem Socketa do zmiennej to nic się nie da?

AcceptSocket jest funkcją blokującą i dlatego ci zawiesza. Zainteresuj się metodami asynchronicznymi co podałem ci w poprzednim poście.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...