I don't know what Joe's program is, but the above is correct when you
are talking to a telnet-like like server. I have no reason to
question Joe's CAsyncServer, but I have not try it to see what it
suppose to do for you.
What part are you trying to make work? What are you looking for?
What I would do is begin with the basics of writing a TTY client. If
you are just learning sockets, you need to begin with the
basics, which comes with "mistakes" and trial and error process.
Try this TTY() function:
void tty(String ^hostname, int port)
{
Console::WriteLine("* Connecting");
TcpClient^ c;
try {
c = gcnew TcpClient(hostname,port);
} catch(SocketException ^e) {
Console::WriteLine(L"- Connect Error {0}",e->ErrorCode);
Console::ReadKey();
return;
}
// use 100ms timeout for reader
c->Client->ReceiveTimeout = 100;
array<Byte>^ bytes = gcnew array<Byte>(1024);
NetworkStream ^cio = c->GetStream();
while (1) {
if (Console::KeyAvailable) {
ConsoleKeyInfo^ key = Console::ReadKey(true);
if (key->Key == ConsoleKey::Escape) break;
try {
cio->WriteByte(key->KeyChar);
} catch( Exception ^e) {
break;
}
}
try {
int nBytes = c->Client->Receive( bytes );
for (int i=0; i < nBytes; i++) {
Console::Write("{0}",(wchar_t)bytes[i]);
}
} catch( SocketException ^e) {
if (e->ErrorCode == 10054) {
Console::WriteLine(L"! Disconnect");
break;
}
}
}
c->Close();
Console::WriteLine("* Closed");
Console::ReadKey();
}
Interesting - this code doesn't work either. Dr. Newcomer's server
says it got a connection, but when I type stuff in nothing gets sent.
I can CTRL-C and then the server says its disconnected. Sooo ...
apparently nothing is getting sent?
I did try calling the .net versions of shutdown() and the
NetworkStream class even has a flush() function, although the doc says
that its reserved for future use. I called it anyway in my code but
still nothing got sent.
Interestingly enough, if I try telnetting to Dr. Newcomer's server I
get the same result as the tty code above - it says its connected, but
nothing gets sent? I could type stuff in, then hit Ctrl-D, Ctrl-G,
whatever Ctrl combo that might hopefully say I'm done sending stuff,
but nothing goes ...
I must be missing something. OnReceive() expects a 4 byte length
followed by n bytes of data. Sending it raw keystrokes will generate a
very large length field will take a very long time to satisfy.