C# hata çözümleme için yardım

micsociet

Katılımcı Üye
21 Nis 2015
581
0
Ankara
Merhaba,

Port dinlemek için c# da program yapmaya çalışıyorum fakat bazı satırlarda hata alıyorum. C# kodlama bilen nerde yanlışım olduğu hakkında yardımcı olabilir mi ? Programlama editörü olarak Windows Visual Studio 2010 kullanıyorum. 101 ve 131. line de Expected class,delegate,enum, interface, or struct hata açıklaması budur.

Kodlar

using System;
using System.Net.Sockets;
using System.IO ;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

public class Form1 : System.Windows.Forms.Form
{
//Burda server da tanımladıklarımızdan farklı olarak TcpClient sınıfı ile serverdan gelen bilgileri alıyoruz
public TcpClient Istemci;
private NetworkStream AgAkimi;
private StreamReader AkimOkuyucu;
private StreamWriter AkimYazici;

private System.Windows.Forms.Button buton;
private System.Windows.Forms.TextBox textbox;

private System.ComponentModel.Container components = null;

public Form1()
{
InitializeComponent();
}


protected override **** Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}


private **** InitializeComponent()
{
//Bu satırları Visual C# oluşturdu.
this.buton = new System.Windows.Forms.Button();
this.textbox = new System.Windows.Forms.TextBox();
this.SuspendLayout();

this.buton.******** = new System.Drawing.Point(8, 40);
this.buton.Name = "buton";
this.buton.Size = new System.Drawing.Size(248, 23);
this.buton.TabIndex = 0;
this.buton.Text = "Sunucuya Baglan";
this.buton.Click += new System.EventHandler(this.buton_Click);

this.textbox.******** = new System.Drawing.Point(8, 8);
this.textbox.Name = "textbox";
this.textbox.Size = new System.Drawing.Size(248, 20);
this.textbox.TabIndex = 1;
this.textbox.Text = "Buraya Sunucuya göndereceginiz yaziyi yazin";

this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(264, 69);
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.textbox,
this.buton});
this.MaximizeBox = false;
this.Name = "Form1";
this.Text = "C#nedir?com";
this.Closing += new System.ComponentModel.CancelEventHandler(this.form1_kapatma);
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}


//giriş noktamız olan mainde yeni bir form1 nesnesini çalıştırıyoruz
static **** Main()
{
Application.Run(new Form1());
}

//From1 yüklendiğinde TcpClient nesnesi oluşturup AgAkımından(NetworkStream) verileri okuyoruz
private **** Form1_Load(object sender, System.EventArgs e)
{
try
{
Istemci = new TcpClient("localhost", 1234);
}
catch
{
Console.WriteLine("Baglanamadi");
return;
}
//Server programında yaptıklarımızı burda da yapıyoruz.
AgAkimi = Istemci.GetStream();
AkimOkuyucu = new StreamReader(AgAkimi);
AkimYazici = new StreamWriter(AgAkimi);
}
}

private **** buton_Click(object sender, System.EventArgs e)
{

//Kullanıcı butona her tıkladığında textbox'ta yazı yoksa uyarı veriyoruz
//Sonra AkimYazici vasıtası ile AgAkımına veriyi gönderip sunucudan gelen
//cevabı AkimOkuyucu ile alıp Mesaj la kullanıcıya gösteriyoruz
//Tabi olası hatalara karşı, Sunucuya bağlanmada hata oluştu mesajı veriyoruz.
try
{
if (textbox.Text=="")
{
MessageBox.Show("Lütfen bir yazi giriniz","Uyari");
textbox.Focus();
return ;
}

string yazi;
AkimYazici.WriteLine(textbox.Text);
AkimYazici.Flush();
yazi = AkimOkuyucu.ReadLine();
MessageBox.Show(yazi,"Sunucudan Mesaj var");
}

catch
{
MessageBox.Show("Sunucuya baglanmada hata oldu...");
}
}

//TVe bütün oluşturduğumuz nesneleri form kapatıldığında kapatıyoruz.
public **** form1_kapatma(object o , CancelEventArgs ec)
{
try
{
AkimYazici.Close();
AkimOkuyucu.Close();
AgAkimi.Close();
}

catch
{
MessageBox.Show("Düzgün kapatilamiyor");
}
}
 
Son düzenleme:

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
4
390
Ankara
Tarihi eser yahu.. .NET Framework 2.0 için mi yazılmış bu? System.NET.TCPClient verimsizdir ve bundan dolayı deprecated diye işaretlenmiştir. Onun yerine socket kullansan çok daha iyi olur.

Form1_Load'un sonunda fazladan } var, programın en sonunda ise eksik bir }...
 

micsociet

Katılımcı Üye
21 Nis 2015
581
0
Ankara
Söylediğini kodlamada nasıl yapabilirim bu arada söylediğin } lerin sondakini silmediğim zaman hata olarak en sondakini gösteriyor onu sildiğimde ise 3 hata daha meydana geliyor. Yardımcı olabilir misin
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
4
390
Ankara

micsociet

Katılımcı Üye
21 Nis 2015
581
0
Ankara
Ustam direkt dosyayı çek.. seninkinin bire bir aynısı, sadece hatası düzeltilmiş..

Bugün vaktim olmayacak, haftasonu Ö.M atabilirsen veya forumda soru sorabilirsen soketlerle nasıl dinleme yapılabileceği konusunda örnek kod yazarım. TCPClient cidden kullanılmamalı...

bunu ayrı bir proje olarak mı açıyorum kendi projeme mi dahil ediyorum ?

Müsait olursan eğer bir çalışma yapabiliriz çoğu yere mesaj bıraktım ama geri dönüş yapan olmadı daha.
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
4
390
Ankara
bunu ayrı bir proje olarak mı açıyorum kendi projeme mi dahil ediyorum ?

Müsait olursan eğer bir çalışma yapabiliriz çoğu yere mesaj bıraktım ama geri dönüş yapan olmadı daha.

Bence notepad'de açıp bire bir kopyala üstadım..

Şeytan çok ama çok kötü dürtüyor, 0'dan C# dersleri hazırla diye.. Çok kötü alışkanlıklar öğretiliyor size. Load event'i içinde olanlar mesela constructor içinde olmalıydı... Onun haricinde bu kod gayet güzel aslında..
 

micsociet

Katılımcı Üye
21 Nis 2015
581
0
Ankara
c# fazla bilmiyorum ben webmaster olarak iş yapıyorumda bi program lazım oldu o yüzden kolları sıvayalım dedim :) ders vermeye başlarsan c# da takip ederim dersleri lazım oluyor arada. Yeni proje olarak oluşturuyorum ben bunu o zaman.
 

micsociet

Katılımcı Üye
21 Nis 2015
581
0
Ankara
Yok hocam böylede olmuyor. En başından bir tane tasarlayacağım başkalarının kaynak kodlarıyla olmadı. Böyle bir program yazabilmem için neler gereklidir ? Belki uygulama olarak bilgisayarımda eksik bişey vardır. sanal pcde yazıyorum bu arada programı olduğu yerde exe dosyasını eksik olarak gösteriyor ve dispose.bool komutunda hata veriyor.
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
4
390
Ankara
Yok hocam böylede olmuyor. En başından bir tane tasarlayacağım başkalarının kaynak kodlarıyla olmadı. Böyle bir program yazabilmem için neler gereklidir ? Belki uygulama olarak bilgisayarımda eksik bişey vardır. sanal pcde yazıyorum bu arada programı olduğu yerde exe dosyasını eksik olarak gösteriyor ve dispose.bool komutunda hata veriyor.

Kodları kontrol etmemiştim, sadece hatayı düzeltmiştim ama aslında mantık doğru idi..

Şimdi temelden bağlayalım.. Tam olarak ne olduğunu bilmediğimiz şeyi yapmakta da zorlanırız.

İki bilgisayar haberleşmek istediğinde, birbirlerine veri paketleri gönderir. Bu paketlerin ne şekilde gönderilmesi, işlenmesi ve kontrol edilmesi gerektiğini bir standarda bağlayan protokoller vardır. Internetwork'te, yani ağlar arasında haberleşme için en çok kullanılan 3 protokol vardır;

- ICMP: Internet Control Message Protocol demektir. Genelde gerçekten bir şeyleri "kontrol" etmek için gönderilir. Mesela bir bilgisayarın hala bağlı olup olmadığını öğrenmek için o makineye ping attığımızda, aslında bir ICMP paketi göndeririz.

Bu protokol en basit tür mesaj paketlerini içerir. Mesajın türünü ve de checksum'ı, yani kontrol için kullanılan bit toplamını asıl verinin önüne ekler gönderirsin.

- UDP: User Datagram Protocol.. İnternetten olan bağlantıları sadece kontrol için kullanmayız. Bir program başka bir programa veri aktaracaksa, bu veriyi de paketler olarak göndermelidir.

Bu durumda da en büyük sorun, mesajın gönderileceği makinede internetten paket bekleyen birden fazla program olma ihtimalidir. Mesela diyelim ki senin bilgisayarında Counter Strike açık, bir internet radyosu dinliyorsun, bir de haberdar olmadığın trojan var o haberleşiyor. Bir veri gönderildiğinde bunun counter strike için mi, radyonun ses verisi mi, yoksa trojan'a komut mu olduğunu bilgisayarın nasıl anlar? Port numarası atarsın.

Bir web sitesi kurduğunda, web sunucusu bilgisayara "ben 80.port olarak işaretlenmiş bütün mesajları alacağım. Onları bana gönder." der. Sen CSGO'yu açtığında o senin bilgisayarına "ben çok fazla türden haber dinliyorum, 27000 ile 27030 arası hangi port numarası ile mesaj gelirse bana aktar" der. Bu şekilde internetten mesaj bekleyen her program bilgisayarında belli bir portu rezerve eder yani "dinler".

UDP, port numarası da kabul eden bir protokoldür. Zaten ICMP'den tek farkı, paketlerin başında bir de "şu porta gidiyor" diye port numarasını ilan etmesidir.

TCP: Transmission Control Protocol.. UDP aslında her işimizi görebilir. Fakat internet, her zaman mükemmel, kopmayan bir bağlantı sunmaz. UDP ile kodlama yaptığımızda devamlı olarak aslında bağlandığımız bilgisayarın kopup kopmadığını, ona son gönderdiğimiz mesajı alıp almadığını kontrol etmemiz gerekir.

Bu kontroller bir standart haline gelince, iletim kontrol protokolü, yani TCP ortaya çıkmıştır. TCP gereken bütün kontrolleri senin için yapar. Bir paket gönderdiğinde o paket yerine ulaşmıştır, ulaşmamışsa hata alırsın zaten. Bütün zamanını diğer ayrıntılara vakfedebilirsin. TCP protokolünde veri paylaşımı her zaman kesilmeden sürdüğünden, TCP paketlerine UDP'deki gibi datagram yani veri pakedi değil de 'stream', akıntı/akış denir.


Değişik durumlar için değişik protokolleri kullanman gerekebilir. Ama şu anda artık en azından TCP nedir, port nedir, paket nedir anladığını varsayıyorum.

Diğer bir bilgisayara bağlanmak istiyorsak, önce internet üstünde işlem yapmak için bir "soket" açarız. Bu soket sayesinde ya bilgisayara "ben bu portu dinliyorum, bana bilgi gelecek" diye bir portu kullanırız, ya da "şu bilgisayarın şu portuna bilgi göndereceğim" deriz. Ondan önce soketimizi açalım..

Kod:
System.Net.Sockets.Socket soket = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);

Anlaması artık kolay olacaktır. Ağlar arası iletişim yapacağız. O zaman yapacağımız şeyin adres ailesi InterNetwork olacak. Yani IP adresleri ile haberleşeceğiz.

Soket türü akış olacak, yani stream. TCP için her zaman stream kullanırsın.

Protokolümüz de TCP olacak.

Kod:
soket.Connect(new System.Net.IPEndPoint(System.Net.IPAddress.Parse("xxx.xxx.xxx.xxx"), 1234));

Adresimizi System.Net.IPAddress olarak parse ettik, bu adresi ve de port numarasını kullanarak bir IPEndPoint - IP Bağlantı noktası oluşturduk, sonra da sokete "buraya bağlan" dedik.

Mesaj gönderme nasıl olur? Biz göndereceği byte'ları söyleriz, o TCP paketini oluşturur.

Kod:
soket.Send(System.Text.Encoding.Default.GetBytes("Al sana mesaj!"));

Bilgisayarında kurulu olan varsayılan dilin encoding'ini alıyorum, bu encoding ile mesajımın byte array halindeki değerini buluyorum ve bunu soketin içinden gönderiveriyorum. Bu kadar.. Ya mesaj alma?

Kod:
byte[] buffer = new byte[1024];
int alinanToplamByte = soket.Receive(buffer);

Ne kadar byte alındığını, bilgisayarın okuması bitene kadar bilemeyiz. Bundan dolayı bir tampon - buffer oluştururuz. Okuma tamamlandığında, bilgisayar bize kaç byte veri aldığını söyler.

İşte bu kadar.. Kalan kısım ayrıntıdır, yapmak istediğin programa göre değişir üstadım.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.