[]

c# asenkron/non-blocking soket
tcp yayınını yakalayıp satır satır ekrana yazdırmak amaç. fakat sadece ilk satırı yazıyor. neden olabilir?
using System;
using System.Collections;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
public class Form1
{
private IPEndPoint iep;
private AsyncCallback callbackProc;
private Socket s;
Byte[] m_byBuff = new Byte[32767];
[STAThread]
static void Main()
{
Form1 form = new Form1();
try
{
form.basla();
}
catch (Exception eeeee)
{
Console.WriteLine("Application Error!!!");
}
}
public void basla()
{
IPAddress ipAd = IPAddress.Parse("/*burada ip adresi var*/");
Form1 f = new Form1();
// Create New Socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Create New EndPoint
f.iep = new IPEndPoint(ipAd, /*burada port numarası var*/);
// This is a non blocking IO
s.Blocking = false;
// Assign Callback function to read from Asyncronous Socket
f.callbackProc = new AsyncCallback(f.ConnectCallback);
// Begin Asyncronous Connection
s.BeginConnect(f.iep, f.callbackProc, s);
}
public void ConnectCallback(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock1 = (Socket)ar.AsyncState;
try
{
if (sock1.Connected)
{
// Define a new Callback to read the data
AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
// Begin reading data asyncronously
sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1);
//ConnectCallback(ar); /*işte bu lanet satırı ekleyince çalışıyor ama recursive yapmaya gerek olmaması gerekmez mi?*/
}
//else Console.WriteLine("Unable to connect to remote machine");
}
catch (Exception ex)
{
Console.WriteLine("Setup Recieve callbackProc failed!");
}
}
public void OnRecievedData(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock = (Socket)ar.AsyncState;
// Get The data , if any
try
{
int nBytesRec = sock.EndReceive(ar);
if (nBytesRec > 0)
{
string sRecieved = Encoding.ASCII.GetString(m_byBuff, 0, nBytesRec);
Console.WriteLine(sRecieved);
}
else
{
Console.WriteLine("Disconnected", sock.RemoteEndPoint);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
Console.Out.Close();
}
}
catch (Exception exx)
{
Console.WriteLine("Unusual error during recieve");
System.Console.Out.Close();
}
}
}
using System;
using System.Collections;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
public class Form1
{
private IPEndPoint iep;
private AsyncCallback callbackProc;
private Socket s;
Byte[] m_byBuff = new Byte[32767];
[STAThread]
static void Main()
{
Form1 form = new Form1();
try
{
form.basla();
}
catch (Exception eeeee)
{
Console.WriteLine("Application Error!!!");
}
}
public void basla()
{
IPAddress ipAd = IPAddress.Parse("/*burada ip adresi var*/");
Form1 f = new Form1();
// Create New Socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Create New EndPoint
f.iep = new IPEndPoint(ipAd, /*burada port numarası var*/);
// This is a non blocking IO
s.Blocking = false;
// Assign Callback function to read from Asyncronous Socket
f.callbackProc = new AsyncCallback(f.ConnectCallback);
// Begin Asyncronous Connection
s.BeginConnect(f.iep, f.callbackProc, s);
}
public void ConnectCallback(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock1 = (Socket)ar.AsyncState;
try
{
if (sock1.Connected)
{
// Define a new Callback to read the data
AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
// Begin reading data asyncronously
sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1);
//ConnectCallback(ar); /*işte bu lanet satırı ekleyince çalışıyor ama recursive yapmaya gerek olmaması gerekmez mi?*/
}
//else Console.WriteLine("Unable to connect to remote machine");
}
catch (Exception ex)
{
Console.WriteLine("Setup Recieve callbackProc failed!");
}
}
public void OnRecievedData(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock = (Socket)ar.AsyncState;
// Get The data , if any
try
{
int nBytesRec = sock.EndReceive(ar);
if (nBytesRec > 0)
{
string sRecieved = Encoding.ASCII.GetString(m_byBuff, 0, nBytesRec);
Console.WriteLine(sRecieved);
}
else
{
Console.WriteLine("Disconnected", sock.RemoteEndPoint);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
Console.Out.Close();
}
}
catch (Exception exx)
{
Console.WriteLine("Unusual error during recieve");
System.Console.Out.Close();
}
}
}

cunku bir kez dinleyip bitiyor, yeniden geldini dinleyen bir eventhandler'a ihtiyacin var ki yeniden geldigini anlayinca console a yazsin.
public void WaitForData(System.Net.Sockets.Socket soc)
{
try
{
if (pfnWorkerCallBack == null)
{
// istemciden bir veri gelme eylemi oldugunda
// cali$acak metodun tanimlanmasi
m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
}
SocketPacket theSocPkt = new SocketPacket(soc);
soc.BeginReceive(theSocPkt.dataBuffer, 0,
theSocPkt.dataBuffer.Length,
SocketFlags.None,
pfnWorkerCallBack,
theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
edit:
compumaster ekledi bir kac $ey, kopyaliyorum aynen.
compumaster: bir de o kadar async kasmasina gerek yok
listen modunda ayri bir thread actiktan sonra blocking listen yapabilir
while open read gibi
public void WaitForData(System.Net.Sockets.Socket soc)
{
try
{
if (pfnWorkerCallBack == null)
{
// istemciden bir veri gelme eylemi oldugunda
// cali$acak metodun tanimlanmasi
m_mainSocket.BeginAccept(new AsyncCallback(OnClientConnect), null);
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
}
SocketPacket theSocPkt = new SocketPacket(soc);
soc.BeginReceive(theSocPkt.dataBuffer, 0,
theSocPkt.dataBuffer.Length,
SocketFlags.None,
pfnWorkerCallBack,
theSocPkt);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
edit:
compumaster ekledi bir kac $ey, kopyaliyorum aynen.
compumaster: bir de o kadar async kasmasina gerek yok
listen modunda ayri bir thread actiktan sonra blocking listen yapabilir
while open read gibi
- sourlemonade
(07.04.08 23:41:27)

teşekkürler, onu fark edip düzelttim ben, uzun zaman olmuş soruyu göndereli. şirket async konusunda takıntılıydı ondan öyle.
- leylak sarabi
(08.04.08 00:31:16)
1