Не могу понять почему один и тот-же код отрабатывает по разному. HTTP и POP протоколы работают как положено, а вот NNTP не получает ответы сервера. Хотя первый ответ (с кодом 200) получает как положено, а дальше все — серверу сообщения уходят, а в ответ тишина.
Тестовый пример:
using System;
using System.Net;
using System.Net.Sockets;
namespace TextSocketClient
{
public class TextSocketClient: IDisposable
{
Byte[] recvBuf = new Byte[512];
private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private System.Text.Encoding encASCII = System.Text.Encoding.ASCII;
public TextSocketClient()
{
}
~TextSocketClient()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(disposing){
if(socket != null){
if(socket.Connected)
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
}
}
}
public void Connect(string host, int port)
{
IPHostEntry hostInfo = Dns.GetHostEntry(host);
IPAddress[] IPAddresses = hostInfo.AddressList;
for(int i=0; i<IPAddresses.Length; i++ ){
socket.Connect(new IPEndPoint(IPAddresses[i], port));
if(socket.Connected){
break;
}
}
}
public string Response()
{
// при работе по 80 и 110 порту все нормально bytesRead > 0;
// а вот по 119 - bytesRead == 0
int bytesRead = socket.Receive(recvBuf);
string recvString = encASCII.GetString(recvBuf, 0, bytesRead);
while(bytesRead > 0)
{
bytesRead = socket.Receive(recvBuf);
if(bytesRead > 0)
recvString = recvString + encASCII.GetString(recvBuf, 0, bytesRead);
}
return recvString;
}
public void SendString(string str)
{
socket.Send(encASCII.GetBytes(str));
}
}
class MainClass
{
public static void Main(string[] args)
{
using(TextSocketClient tsc = new TextSocketClient())
{
tsc.Connect("ya.ru", 80);
tsc.SendString("GET / HTTP/1.1\r\nHost: ya.ru\r\nConnection: Close\r\n\r\n");
Console.Write(tsc.Response()); // ответ сервера есть
};
Console.WriteLine();
using(TextSocketClient tsc = new TextSocketClient())
{
tsc.Connect("pop.yandex.ru", 110);
tsc.SendString("USER tsc\r\n");
Console.Write(tsc.Response()); // ответ сервера есть
tsc.SendString("QUIT\r\n");
};
Console.WriteLine();
using(TextSocketClient tsc = new TextSocketClient())
{
tsc.Connect("news4.fido7.ru", 119);
Console.Write(tsc.Response()); // ответ сервера есть
tsc.SendString("LIST\r\n");
Console.Write(tsc.Response()); // ответа от сервера нет
tsc.SendString("QUIT\r\n");
Console.Write(tsc.Response()); // ответа от сервера нет
};
}
}
}
telnet host 119 — все в порядке
аутлук — подписывается на ньсы и получает их
не вижу суслика