【发布时间】:2010-10-13 19:22:35
【问题描述】:
我是 C# 的新手,只是尝试使用 C# 编写一个客户端,该客户端将远程登录 Ubuntu 服务器并登录到该服务器。我使用 Putty 或 windows cmd 登录到这个服务器,响应是这样的:
------------------欢迎来到syseng1-------------------- 这台机器是系统工程自动化服务器 -------------------------------------------------- ------ Ubuntu 8.04.3 LTS syseng1 登录:但是当我使用 C# async socket 尝试登录到这个服务器时,我无法接收如上所示的最后两行。
这是我的代码:
private void OnRecievedData(IAsyncResult ar)
{
// Get The connection socket from the callback
Socket sock = (Socket)ar.AsyncState;
// Get The data , if any
int nBytesRec = sock.EndReceive(ar);
if (nBytesRec > 0)
{
// Decode the received data
//byte[] buf = Encoding.Convert(Encoding.UTF8, Encoding.UTF8, m_byBuff, 0, nBytesRec);
// String sRecieved = Encoding.UTF8.GetString(m_byBuff, 0, nBytesRec);
// string sRecieved = Encoding.GetEncoding("utf-8").GetString(m_byBuff, 0, nBytesRec);
string sRecieved = "";
for (int i = 0; i < nBytesRec; i++)
{
Char ch = Convert.ToChar(m_byBuff[i]);
switch (ch)
{
case '\r':
sRecieved += Convert.ToString("\r\n");
break;
case '\n':
break;
default:
sRecieved += Convert.ToString(ch);
break;
}
}
// Console.WriteLine(sRecieved);
strWorkingData += sRecieved;
strFullLog += sRecieved;
richbox.Invoke(new UpdateTextCallback(this.UpdateText), sRecieved);
// Launch another callback to listen for data
//AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
sock.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, OnRecievedData, sock);
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine("Disconnected", sock.RemoteEndPoint);
sock.Shutdown(SocketShutdown.Both);
sock.Close();
//Application.Exit();
}
}
我还尝试使用 ruby 来查找如果我使用套接字登录此服务器时收到的确切信息。这是我的日志:
Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\vzheng>irb irb(main):001:0> 需要 'socket' => 真 irb(main):002:0> 包括 Socket::Constants => 对象 irb(main):003:0> socket = Socket.new(AF_INET, SOCK_STREAM, 0) => # irb(main):004:0> sockaddr = Socket.sockaddr_in(23, '10.4.0.50' => "\002\000\000\027\n\004\0002\000\000\000\000\000\000\000\000 irb(main):005:0> socket.connect(sockaddr) => 0 irb(主):006:0> irb(main):007:0* socket.gets => "--------------------欢迎来到 syseng1--------\r\ irb(main):008:0> socket.gets => "这台机器是系统工程自动化服务器\r\ irb(main):009:0> socket.read(40) => "----------------------------------------" irb(main):010:0> socket.read(2) => "--" irb(main):011:0> socket.read(2) => "--" irb(main):012:0> socket.read(2) => "--" irb(main):013:0> socket.read(2) => "--" irb(main):014:0> socket.read(2) => "--" irb(main):015:0> socket.read(2) => "--" irb(main):016:0> socket.read(2) => "--" irb(main):017:0> socket.read(2) => "--" irb(main):018:0> socket.read(2) => "\r\n" irb(main):019:0> socket.read(2) => "\377\375" irb(main):020:0> socket.read(1) => "'" irb(main):021:0> socket.read(1) (挂在那里)...所以无论是c#还是ruby的socket,我只能收到前三行,但我不能收到后面的行。
Ubuntu 8.04.3 LTS syseng1 登录:你们能不能给我一些关于这个问题的想法?
【问题讨论】:
标签: c#