Merhabalar, Sebebini çzemediğim bir hatayla karşı karşıyayım. Şyle anlatmaya çalışayım: Elimde 2 class var. Bunlardan birisi ana program, diğeri async bağlantılar yapan bir TCPClient içeren başka bir class. Bu classta gelen mesajın ana programa ynlendirilmesi için bir deligate var, o deligate içinde de ana programda bulunan bir methoda referans var. Ana programa verileri alabiliyorum, gelen veri bir string. Fakat, peşpeşe çok fazla veri gelirse, o string üzerinde çalışamıyorum. string. IndexOf, StartsWith vs hepsi yanlış bilgi veriyor, fakat sadece string i yazdırdığımda doğru string olduğunu grebiliyorum. Veri akışını yavaşlatırsam hiç bir sıkıntı olmadan çalışabiliyorum. Bunun nedeni ne olabilir? Kodun gerekli kısmını kopyalıyorum: İlk nce ana programda çalışan method, test için: public static void serverConnection_serverMessage Bu da bağlantıyı izleyen kod: public event serverMessageEventHandler serverMessage; public delegate void serverMessageEventHandler ; public Baglanti { this. connection. Connect ; //Baglanabildiyse if } //Mesaj geldiginde void handleServerMessage { //Uzunlugu lazim int receivedCount; try catch //0 kapandi demek if (receivedCount 0) //Ana programa gonder this. serverMessage(Encoding. Default. GetString(buffer, 0, receivedCount)); //Bir sonraki mesaji bekle connection. Client. BeginReceive(this. buffer, 0, this. buffer. Length, SocketFlags. None, new AsyncCallback , null); }

Ne mutlu çzüldüyse. sana tavsiyem boyle durumlarda : https://blog.brunogarcia.com/2012/10/simple-tcp-forwarder-in-c.html, https://github.com/GangZhuo/TcpUdpForwarder/tree/master/TcpUdpForwarder bunlar gibi bir port ynlendirici ile debug yapman olacaktır. Bu aralar fazla yogunum. Unuttugum seyler oluyorsa affola. DM vs atın.

Çzüldüyse sevindim hocam :) Kolay gelsin arada oluyor byle şeyler :DD:D:D Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu nünden daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

Hocam tam olarak programın yada algoritmanın çalışma mantığını bilmiyorum. Fakat şyle dene nce A istemcisi B istemcisine veri gnderiyor Sen A dan B ye tek tek 1 den 50 ye kadar veri gnderiyorsun. Async fonksiyonu çalışırken 1:test 2 3 4 5 6 7:test mi yazyor? yani 1 i alınca test yazıyor 7 ye kadar test yazmıyor? Doğru mu anlıyorum? Byle bir şey mümkün değil yada oradaki çalıştırdığın socketin data boyutunca veri gnderiyor ki bu saçma bir şey olur. Yani sylediğin şey mantıksız. Yada benim sana anlattığım gibi bir olay rgüsü var. Sen string'e 1 i yazdın sonra 1:test çıktıyı üretti. O ara Socket 6 tane daha data gnderdi. sen 6 datayı da aynı anda o değişkene yazdın oldu mu sana 2 3 4 5 6 7 daha sonra :test ekledi sonuna senin algoritman ve sonuç çıktısı 2 3 4 5 6 7:test oldu? Bence senin sorunun Multi Thread hocam socket ile ilgili değil. Benim sana dediğim gibi eğer her datayı bir UUID ile tutarsan LinkedList yada bir Stack mantığı ile FIFO mantığını kullanarak O Arrayde yada listede data oldukça okursun. Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu nünden daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

Hocam tam olarak programın yada algoritmanın çalışma mantığını bilmiyorum. Fakat şyle dene nce A istemcisi B istemcisine veri gnderiyor Sen A dan B ye tek tek 1 den 50 ye kadar veri gnderiyorsun. Async fonksiyonu çalışırken 1:test 2 3 4 5 6 7:test mi yazyor? yani 1 i alınca test yazıyor 7 ye kadar test yazmıyor? Doğru mu anlıyorum? Byle bir şey mümkün değil yada oradaki çalıştırdığın socketin data boyutunca veri gnderiyor ki bu saçma bir şey olur. Yani sylediğin şey mantıksız. Yada benim sana anlattığım gibi bir olay rgüsü var. Sen string'e 1 i yazdın sonra 1:test çıktıyı üretti. O ara Socket 6 tane daha data gnderdi. sen 6 datayı da aynı anda o değişkene yazdın oldu mu sana 2 3 4 5 6 7 daha sonra :test ekledi sonuna senin algoritman ve sonuç çıktısı 2 3 4 5 6 7:test oldu? Bence senin sorunun Multi Thread hocam socket ile ilgili değil. Benim sana dediğim gibi eğer her datayı bir UUID ile tutarsan LinkedList yada bir Stack mantığı ile FIFO mantığını kullanarak O Arrayde yada listede data oldukça okursun. Keşke sorunum multithread de olsaymış hocam. Kaç saattir bu koda bakıyorum, yanlış bir şey gremiyorum. Sorun bu kısımda değild de veriyi gnderdiğim yerdeymiş. Ekstradan 2 byte gnderiyormuş, o yüzden ben gelen veriyi işleyemiyormuşum. Çzüldü sonunda :D

Ana programda stringin kopyasıyla çalıştıığınızda ne sonuç veriyor peki? Olaylara karışmayın!

Ana programda stringin kopyasıyla çalıştıığınızda ne sonuç veriyor peki? Başka bir stringe aktarıp deneyince de aynı hocam. Miktar artınca bozuluyor hemen

İlginç. Bununla ilgili bir şey de bulamadım. Yanlış değer dnen yere breakpoint koyup watch kısmında incelediniz mi? Olmadı. net fw sürümünü değiştirip deneyin. Olaylara karışmayın!

Normal değil mi? Sen Async çalıştırıyorsun, O an Socketten aynı anda 2 veri geliyor ve sen 1 veriyi yazarken diğer veriyi de üstüne yazıyorsun. Yani ABC -> geldi DEF -> geldi ADBCEF oldu ; normal bir yaklaşım. Senin buna çzüm bulman gerekiyor hocam. Bence flag mantığını kullanmalısın. Yani bir veriyi stringe doldurmadan diğer veriyi yazdırmaman gerekiyor. Her Async hadle fonksiyonu çağırıldığında Class oluştur bir tane class : UUID;Data şeklinde bunu da array'e at. Fonksiyon handle pozisyonuna geçtiğinde uuid ata fonksiyonun başında sen bu uuid fonksiyonuyla iş yap. Senin her datan o uuidye yazılsın ordan oku. Sen tek değişkene atıp okumaya çalışıyorsun. Merhaba hocam, benim anlayamadığım şey şu. Mesela bir rnek vereyim. Benim veriyi işleyen methodumun içine, WriteLine ; yazıyorum mesela, veriyi aldığını grebiliyorum. Ama veriyle test stringini birleştiremiyor. Hızlıca sockete 1 ile 50 arası sayılar yazdırırsam mesela, şyle oluyor genelde: 1: test 2 3 4 5 6 7: test 8 9... Veriyi aldıktan sonra işleyebilmesi gerek miyor mu? O WriteLine ın altına tekrardan GelenVeri yi yazdırırsam grebiliyorum ki veri değişmemiş.

Normal değil mi? Sen Async çalıştırıyorsun, O an Socketten aynı anda 2 veri geliyor ve sen 1 veriyi yazarken diğer veriyi de üstüne yazıyorsun. Yani ABC -> geldi DEF -> geldi ADBCEF oldu ; normal bir yaklaşım. Senin buna çzüm bulman gerekiyor hocam. Bence flag mantığını kullanmalısın. Yani bir veriyi stringe doldurmadan diğer veriyi yazdırmaman gerekiyor. Her Async hadle fonksiyonu çağırıldığında Class oluştur bir tane class : UUID;Data şeklinde bunu da array'e at. Fonksiyon handle pozisyonuna geçtiğinde uuid ata fonksiyonun başında sen bu uuid fonksiyonuyla iş yap. Senin her datan o uuidye yazılsın ordan oku. Sen tek değişkene atıp okumaya çalışıyorsun. EDİT ; hocam birde swapping işlemlerine dikkat et. Aynı anda 2 stringin bitme ihtimali var yada kaç tane Thread var ise işlemcide o kadar sayınca değişkenin aynı bitme ihtimali var. Ben bunu Linux tarafında her porttan gelen veri C++ ile dinliyorum Ramde bir adreste tutuyorum. veriyi okurkende C++ daki adresi ilgili programlama diline aktarıp veriyi o şekilde okuyorum. Daha hızlı oluyor C++ da socket ynetimi daha basit. Proccessleri vs de kontrol ettiğin için hangi işlem ne zaman bitmiş data neymiş hangi socketid den gelmiş alayının logunu tutabiliyorsun. MhmdAlmz tarafından 31/Ara/18 11:58 tarihinde düzenlenmiştir Andolsun kuşluk vaktine ve dindiği zaman o geceye ki, Rabbin sana veda etmedi ve darılmadı! Ve kesinlikle senin için sonu nünden daha hayırlıdır. ileride Rabbin sana verecek de hoşnut olacaksın! O, seni bir yetim iken barındırmadı mı? Seni, yol bilmez iken yola koymadı mı? Seni bir yoksul iken zengin etmedi mi? yle ise, sakın yetime kahretme ! El açıp isteyeni de azarlama! Fakat Rabbinin nimetini anlat da anlat!

Çok daha derin bir sorun değilse ki sanmıyorum, GetString ile metne çevirdiğin veride yine büyük ihtimalle sonda null bayt var gibi grünüyor. this. serverMessage(Encoding. Default. GetString(buffer, 0, receivedCount)); satırını aşağıdaki ile değiştirerek deneyebilirsin. Burada yapılan iş kabaca metinden NULL karakterlerini temizlemek. //Ana programa gonder string hamMetin = Encoding. Default. GetString(buffer, 0, receivedCount); string temizMetin = hamMetin. Replace("\0", ""); this. serverMessage ; Denedim hocam, hala aynı sonucu alıyorum. newline ları temizledim, null ları temizledim.

Çok daha derin bir sorun değilse ki sanmıyorum, GetString ile metne çevirdiğin veride yine büyük ihtimalle sonda null bayt var gibi grünüyor. this. serverMessage(Encoding. Default. GetString(buffer, 0, receivedCount)); satırını aşağıdaki ile değiştirerek deneyebilirsin. Burada yapılan iş kabaca metinden NULL karakterlerini temizlemek. //Ana programa gonder string hamMetin = Encoding. Default. GetString(buffer, 0, receivedCount); string temizMetin = hamMetin. Replace("\0", ""); this. serverMessage ; anlıyorum.

İlginç. Bununla ilgili bir şey de bulamadım. Yanlış değer dnen yere breakpoint koyup watch kısmında incelediniz mi? Olmadı. net fw sürümünü değiştirip deneyin. Kodu deneme imkanınız varsa bir de siz bakar mısınız hocam? Çok garip şeyler dnüyor. WriteLine ; yazıyorum, sadece gelen stringi yazıyor, gerisini sadece bazılarına yazıyor. Belli bir düzen de yok. Bazen birinci ve drdüncü mesaja, bazen onbirinci...