Hi,
I am working with the sample code for Asynchronous Clients: Asynchronous Server Socket Example
My Server platform is WinCE 5.0 CF2. When I connect the first time and pass a string. It works as expected. When I connect again with a second instance, The Socket.BeginRecieve call gets made, but the actual Call back never occurs. So, I see a connection occur, but a second socket and thread do not appear to get fired off.
I see Waiting for connection.... Over and over again....
This appears to be a bug. Near identical code worked fine on CF1.1
DGMQS

Socket.BeginRecieve Mystery
Karim Hemani
Also,
New data. This works fine on XP, but not on CF 2.0.
Here is the code.
class Program{
// Thread signal. public static ManualResetEvent allDone = new ManualResetEvent(false);
public static int Main(String[] args){
StartListening();
return 0;}
public static void StartListening(){
// Data buffer for incoming data. byte[] bytes = new Byte[1024]; // Establish the local endpoint for the socket. // The DNS name of the computer // running the listener is "host.contoso.com". IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); IPAddress ipAddress = ipHostInfo.AddressList[0]; IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 6969); // Create a TCP/IP socket. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and listen for incoming connections. try{
listener.Bind(localEndPoint);
listener.Listen(100);
while (true){
// Set the event to nonsignaled state.allDone.Reset();
// Start an asynchronous socket to listen for connections. Console.WriteLine("Waiting for a connection...");listener.BeginAccept(
new AsyncCallback(AcceptCallback),listener);
// Wait until a connection is made before continuing.allDone.WaitOne();
}
}
catch (Exception e){
Console.WriteLine(e.ToString());}
Console.WriteLine("\nPress ENTER to continue..."); Console.Read();}
public static void AcceptCallback(IAsyncResult ar){
// Signal the main thread to continue.allDone.Set();
// Get the socket that handles the client request. Socket listener = (Socket)ar.AsyncState; Socket handler = listener.EndAccept(ar); // Create the state object. StateObject state = new StateObject();state.workSocket = handler;
handler.BeginReceive(state.buffer, 0,
StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);}
public static void ReadCallback(IAsyncResult ar){
String content = String.Empty; // Retrieve the state object and the handler socket // from the asynchronous state object. StateObject state = (StateObject)ar.AsyncState; Socket handler = state.workSocket; // Read data from the client socket. int bytesRead = handler.EndReceive(ar); if (bytesRead > 0){
// There might be more data, so store the data received so far.state.sb.Append(
Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
// Check for end-of-file tag. If it is not there, read // more data.content = state.sb.ToString();
if (content.IndexOf("</CmdRequest>") > -1){
// All the data has been read from the // client. Display it on the console. Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",content.Length, content);
// Echo the data back to the client.Send(handler,
"<CmdResult>OK</CmdResult>");}
else{
// Not all data received. Get more.handler.BeginReceive(state.buffer, 0,
StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);}
}
}
private static void Send(Socket handler, String data){
// Convert the string data to byte data using ASCII encoding. byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);}
private static void SendCallback(IAsyncResult ar){
try{
// Retrieve the socket from the state object. Socket handler = (Socket)ar.AsyncState; // Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); Console.WriteLine("Sent {0} bytes to client.", bytesSent);handler.Shutdown(
SocketShutdown.Both);handler.Close();
}
catch (Exception e){
Console.WriteLine(e.ToString());}
}
}
public class StateObject{
// Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 1024; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder();}
Jagoop
J M B
I have looked at the above code and added the client portion as well. The program seems to run fine on PPC 2003 and WM 5.0 PPC with NETCF 2.0 SP1. Below is the program:
using
System;using
System.Net;using
System.Net.Sockets;using
System.Threading;using
System.Text;class
Program{
// Thread signal. public static ManualResetEvent allDone = new ManualResetEvent(false); public static bool done = false; public static int Main(String[] args){
Thread t = new Thread(new ThreadStart(DoSend));t.Start();
StartListening();
t.Join();
return 0;}
public static void DoSend(){
Thread.Sleep(5000); string s1 = "<CmdRequest>"; string s2 = "</CmdRequest>"; string s3 = new string('a', 2000); for (int i = 0; i < 10; i++){
Console.WriteLine("Request: " + i);Socket s =
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);s.Connect(
new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6969)); string str = s1 + s3 + s2; char[] a_char = str.ToCharArray(); byte[] buf = Encoding.UTF8.GetBytes(a_char, 0, a_char.Length);s.Send(buf, 0, buf.Length, SocketFlags.None);
byte[] buf2 = new byte[1024]; int len = -1; StringBuilder sb = new StringBuilder(); while ((len = s.Receive(buf2, 0, buf2.Length, SocketFlags.None)) > 0){
sb.Append(
Encoding.UTF8.GetString(buf2, 0, len));}
Console.WriteLine("Got: " + sb.ToString());}
Console.WriteLine("Client done");done =
true;allDone.Set();
}
public static void StartListening(){
// Data buffer for incoming data. byte[] bytes = new Byte[1024]; // Establish the local endpoint for the socket. // The DNS name of the computer // running the listener is "host.contoso.com". //IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); //IPAddress ipAddress = ipHostInfo.AddressList[0];IPAddress ipAddress = IPAddress.Any;
IPEndPoint localEndPoint =
new IPEndPoint(ipAddress, 6969); // Create a TCP/IP socket.Socket listener =
new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
// Bind the socket to the local endpoint and listen for incoming connections. try{
listener.Bind(localEndPoint);
listener.Listen(100);
while (!done){
// Set the event to nonsignaled state.allDone.Reset();
// Start an asynchronous socket to listen for connections. Console.WriteLine("Waiting for a connection...");listener.BeginAccept(
new AsyncCallback(AcceptCallback),listener);
// Wait until a connection is made before continuing.allDone.WaitOne();
}
}
catch (Exception e){
Console.WriteLine(e.ToString());}
Console.WriteLine("\nPress ENTER to continue..."); Console.ReadLine();}
public static void AcceptCallback(IAsyncResult ar){
// Signal the main thread to continue.allDone.Set();
// Get the socket that handles the client request.Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// Create the state object.StateObject state =
new StateObject();state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);}
public static void ReadCallback(IAsyncResult ar){
String content = String.Empty; // Retrieve the state object and the handler socket // from the asynchronous state object.StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket. int bytesRead = handler.EndReceive(ar); if (bytesRead > 0){
// There might be more data, so store the data received so far.state.sb.Append(
Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
// Check for end-of-file tag. If it is not there, read // more data.content = state.sb.ToString();
if (content.IndexOf("</CmdRequest>") > -1){
// All the data has been read from the // client. Display it on the console. Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",content.Length, content);
// Echo the data back to the client.Send(handler,
"<CmdResult>OK</CmdResult>");}
else{
// Not all data received. Get more.handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);}
}
}
private static void Send(Socket handler, String data){
// Convert the string data to byte data using ASCII encoding. byte[] byteData = Encoding.ASCII.GetBytes(data); // Begin sending the data to the remote device.handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);}
private static void SendCallback(IAsyncResult ar){
try{
// Retrieve the socket from the state object.Socket handler = (Socket)ar.AsyncState;
// Complete sending the data to the remote device. int bytesSent = handler.EndSend(ar); Console.WriteLine("Sent {0} bytes to client.", bytesSent);handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch (Exception e){
Console.WriteLine(e.ToString());}
}
}
public
class StateObject{
// Client socket. public Socket workSocket = null; // Size of receive buffer. public const int BufferSize = 1024; // Receive buffer. public byte[] buffer = new byte[BufferSize]; // Received data string. public StringBuilder sb = new StringBuilder();}
Can you run the program and see if it works on your device
Cheers,
Anthony Wong [MSFT]