Сокеты. Дискриминация 119 порта?
От: _Raz_  
Дата: 28.02.06 19:49
Оценка:
Не могу понять почему один и тот-же код отрабатывает по разному. 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());  // ответа от сервера нет
            };
        }
    }
}
Дополнение: Сокеты. Дискриминация 119 порта?
От: _Raz_  
Дата: 28.02.06 20:25
Оценка:
telnet host 119 — все в порядке
аутлук — подписывается на ньсы и получает их

не вижу суслика
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.