Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TCP Server 
:(
    Опции темы
Experimenter
Дата 29.1.2008, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 1
Всего: 17



Доброго здоровья, уважаемые!

Столкнулся недавно с такой траблой. Решил сделать TCP сервер, до этого работал с HTTP протоколом, никогда такого не было. Бессовестно передрал код у Либерти, немного своего добавил:
Код

using System;
using System.Data;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class AsyncTcpServer
{
    private string host = "127.0.0.1";
    private int port = 9999;

    public static void Main()
    {
        AsyncTcpServer app = new AsyncTcpServer();
        app.Run();
    }

    private void Run()
    {
        Console.WriteLine("***************TCP Server***************\r\n");
        try
        {
             IPAddress ipHost;

            if (!IPAddress.TryParse(host, out ipHost))
            {
                Console.WriteLine("Ошибка! Неверный адрес");
                return;
            }

            TcpListener listener = new TcpListener(ipHost, port);
            listener.Start();

            for (; ; )
            {
                Socket socketForClient = listener.AcceptSocket();
                if (socketForClient.Connected)
                {
                    Console.WriteLine("Client connected");
                    ClientHandler handler = new ClientHandler(socketForClient);
                    handler.StartRead();
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Ошибка. " + ex.Message + "\r\nНажмите 'Enter' для выхода");
            Console.ReadLine();
        }
    }

    class ClientHandler
    {
        private byte[] buffer;
        private Socket socket;
        private NetworkStream networkStream;
        private AsyncCallback callbackRead;
        private AsyncCallback callbackWrite;

        public ClientHandler(Socket socketForClient)
        {
            socket = socketForClient;
            buffer = new byte[256];
            networkStream = new NetworkStream(socketForClient);
            callbackRead = new AsyncCallback(this.OnReadComplete);
            callbackWrite = new AsyncCallback(this.OnWriteComplete);
        }

        public void StartRead()
        {
            networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null);
        }

        private void OnReadComplete(IAsyncResult ar)
        {
            int bytesRead = networkStream.EndRead(ar);
            if (bytesRead > 0)
            {
                string s = System.Text.Encoding.ASCII.GetString(buffer, 0, bytesRead);
  
                Console.Write("Received {0} bytes from client: {1}", bytesRead, s);
                networkStream.BeginWrite(buffer, 0, buffer.Length, callbackWrite, null);                
            }
            else
            {
                Console.WriteLine("Чтение данных завершено");
                networkStream.Close();
                socket.Close();
                networkStream = null;
                socket = null;
            }
        }

        private void OnWriteComplete(IAsyncResult ar)
        {
            networkStream.EndWrite(ar);
            Console.WriteLine("Запись в сокет завершена");
            networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, null);
        }
    }
}
подключался к ней телнетом, работает с одним НО: с локальным адресом внутри собственной машины. Дал эту консоль клиенту, когда он меняет адрес на сетевой, она выдает что угодно (различные ошибки, типа "нет связи" или "адрес неверен"), кроме данных. Радмином или телнетом клиент из сети к своей машине подключается нормально. К сожалению лишен возможности тестировать прогу в локальной сети, поэтому потерялся в догадках. Что поменять? (настройки, код, локалку, программера, варианты...) Заранее благодарен.


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
mr.DUDA
Дата 29.1.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 2
Всего: 232



Experimenter, может ему файрвол мешает? Есть ещё вариант поставить виртуальную машину у себя на компе, настроить сеть и тестировать соединение между её IP и своим.  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.