Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/67: Рейтинг темы: голосов - 67, средняя оценка - 4.90
45 / 44 / 7
Регистрация: 15.10.2008
Сообщений: 320
1

В сервере ошибка Обычно разрешается одно использование адреса сокета

13.04.2009, 19:16. Показов 14038. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В сервере моего приложения при отправке файла возникает ошибка "Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)"
в строке tcpListener.Start();
что надо изменить и как ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
private readonly ArrayList  aryClients = new ArrayList();   
        const int nPortListen = 2000;
        private static IPHostEntry ipEntry;
        static IPAddress [] aryLocalAddr = null;   
        //readonly TcpClient client = clientListener.AcceptTcpClient();
        static void Main()
        {
            var app = new AppMain();
            Console.WriteLine( "-= Мессенджер начал свою работу в {0} =- ", DateTime.Now.ToString( "G" ) );
 
            
            String strHostName = "";
            
            try
            {
                strHostName = Dns.GetHostName();
                #pragma warning disable 618,612
                ipEntry = Dns.GetHostByName( strHostName );
                #pragma warning restore 618,612
                aryLocalAddr = ipEntry.AddressList;
            }
            catch( Exception ex )
            {
                Console.WriteLine("Ошибка, пробующая получить локальный адрес {0} ", ex.Message);
            }
 
            // Проверьте, мы получили адрес IP. Скажите пользователю, если мы сделали
            if( aryLocalAddr == null || aryLocalAddr.Length < 1 )
            {
                Console.WriteLine( "невозможно получить локалный адрес" );
                return;
            }
            Console.WriteLine( "Listening on : [{0}] {1}:{2}", strHostName, aryLocalAddr[0], nPortListen );
 
            // Create the listener socket in this machines IP address
            var listener = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
            listener.Bind( new IPEndPoint( aryLocalAddr[0], 2000 ) );
            listener.Listen( 10 );
........................
public void OnRecievedData(IAsyncResult ar)
        {
 
 
            var client = (SocketChatClient)ar.AsyncState;
            byte[] aryRet = client.GetRecievedData(ar);
 
            // проверка на получение данных, если нет их, то связь прервана
            if (aryRet.Length < 1)
            {
                Console.WriteLine("Client {0}, disconnected", client.Sock.RemoteEndPoint);
                client.Sock.Close();
                aryClients.Remove(client);
                return;
            }
 
            // Отправляем полученные данные всепм клиентам
            foreach (SocketChatClient clientSend in aryClients)
            {
                try
                {
                    clientSend.Sock.Send(aryRet);
                }
                catch
                {
                    // если отправка не удалась, то закрываем подключение
                    Console.WriteLine("отправка к кленту  {0} неудалась", client.Sock.RemoteEndPoint);
                    clientSend.Sock.Close();
                    aryClients.Remove(client);
                    return;
                }
            }
            client.SetupRecieveCallback(this);
 
 
 
 
            IPAddress ip = IPAddress.Parse(aryLocalAddr[0].ToString());
// ReSharper disable AssignNullToNotNullAttribute
            var tcpListener = new TcpListener(ip, nPortListen);
// ReSharper restore AssignNullToNotNullAttribute
            
            tcpListener.Start();
            TcpClient tcpClient = tcpListener.AcceptTcpClient();
            NetworkStream ns = tcpClient.GetStream();
            var sr = new StreamReader(ns);
            string result = sr.ReadToEnd();
            tcpClient.Close();
            tcpListener.Stop();
 
      
        }
Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2009, 19:16
Ответы с готовыми решениями:

Сокеты. Ошибка «Обычно разрешается одно использование адреса сокета»
Имеется отправка строк string AcceptLogin = Логин.Text + Пароль.Text; //AcceptLogin =...

Ошибка в клиенте: Обычно разрешается одно использование адреса сокета
Здравствуйте, я изучаю сетевое программирование. Начал программирование сокетов. Вот сервер:...

Обычно разрешается одно использование адреса сокета (протокол/сетевой адрес/порт)
Написал клиент-сервер для передачи файлов(первый опыт). При подключении клиента к серверу дает...

Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
При запуске вызывается ошибка на строчке с Bind. Обычно разрешается только одно использование...

4
15 / 14 / 2
Регистрация: 15.01.2009
Сообщений: 55
16.04.2009, 09:18 2
Если вызывается такое исключение, значит данный сокет уже используется.

Конкретно в твоём случае сокет сначала биндится (строка 37) и запускается прослушивание, затем, при поступлении данных опять производится попытка забиндить этот-же сокет (строка 83).
0
45 / 44 / 7
Регистрация: 15.10.2008
Сообщений: 320
16.04.2009, 10:17  [ТС] 3
-Dash-, и как с этим бороться не подскажеш? как изменить код, чтобы дважды не включать?...
0
15 / 14 / 2
Регистрация: 15.01.2009
Сообщений: 55
16.04.2009, 11:08 4
В MSDN есть классический пример работы с сокетами.

Я реализовал это так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
private Thread поток;
public void Ожидание(Int32 порт) {
    if(поток == null) {
        поток = new Thread(ПотокОжидания);
        поток.Name = String.Format("Поток {0}", порт);
        поток.Start(порт);
    }
}
public void Стоп() {
    if(поток != null) {
        поток.Abort();
        поток = null;
    }
}
private ManualResetEvent ожиданиеСоединения = new ManualResetEvent(false);
private void ПотокОжидания(Object порт) {
    Socket сокет = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    this.сокет = сокет;
    EndPoint точка = new IPEndPoint(IPAddress.Any, (Int32)порт);
    try {
        сокет.Bind(точка);
        сокет.Listen(1000);
        while(true) {
            ожиданиеСоединения.Reset();
            сокет.BeginAccept(new AsyncCallback(УстановкаВходящегоСоединения), сокет);
            ожиданиеСоединения.WaitOne();
        }
    } catch(ThreadAbortException) {
        сокет.Close();
        сокет = null;
    } catch(Exception ex) {
        Console.WriteLine(ex.ToString());
        сокет.Close();
        сокет = null;
    }
}
 
private void УстановкаВходящегоСоединения(IAsyncResult ar) {
    ожиданиеСоединения.Set();
 
    Socket сокет;
    try {
        сокет = (ar.AsyncState as Socket).EndAccept(ar);
    } catch(ObjectDisposedException) {
        return;
    }
 
    if(СоединениеУстановлено != null) {
        СоединениеУстановлено(сокет);
    }
    Приёмник приёмник = new Приёмник(сокет);
    ОжиданиеДанных(приёмник);
}
 
private void ОжиданиеДанных(Приёмник приёмник) {
    try {
        приёмник.Сокет.BeginReceive(
            приёмник.Буфер,
            0,
            приёмник.Буфер.Length,
            SocketFlags.None,
            new AsyncCallback(ПолучениеДанных),
            приёмник
        );
    } catch(SocketException ex) {
        Console.WriteLine(ex.ToString());
    }
}
 
private void ПолучениеДанных(IAsyncResult ar) {
    Приёмник приёмник = (Приёмник)ar.AsyncState;
    Int32    получено = 0;
    try {
        получено = приёмник.Сокет.EndReceive(ar);
    } catch(SocketException ex) {
        String сообщение = ex.Message;
        if(ОшибкаСоединения != null) {
            switch(ex.SocketErrorCode) {
                case SocketError.ConnectionReset: {
                    сообщение = "Соединение было экстренно разорвано";
                    break;
                }
            }
            ОшибкаСоединения(сообщение);
        }
        приёмник.Сокет.Close();
        return;
    }
 
    if(получено > 0) {
        if(ДанныеПолучены != null) {
            ДанныеПолучены(приёмник.Сокет, приёмник.Буфер, получено);
        }
        ОжиданиеДанных(приёмник);
    } else {
        if(СоединениеРазорвано != null) {
            СоединениеРазорвано(приёмник.Сокет);
        }
        if(приёмник.Сокет.Connected) {
            приёмник.Сокет.Close();
            приёмник.Сокет = null;
        }
    }
}
1
45 / 44 / 7
Регистрация: 15.10.2008
Сообщений: 320
16.04.2009, 12:38  [ТС] 5
ого се!!! надо разобраться
0
16.04.2009, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2009, 12:38
Помогаю со студенческими работами здесь

Error: Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт)
Можно ли как-то обойти эту ошибку, и отправить пакет на &quot;занятый&quot; адрес/порт

Проблема с UdpClient (разрешается только одно использование адреса сокета)
Есть приложение, которое отсылает содержимое файла на указанный порт: using (UdpClient server =...

Обычно разрешается только одно использование адреса сокета(протокол/сетевой адрес/порт)
Вот возникла проблема, существует многопоточный C# сервер работающий на UDP, слушающий 4 порта и...

TcpSocket: Обычно разрешается только одно использование адреса сокета
Понимаю, что тем с таким заголовком уже уйма, но ответа я так и не увидел. А точнее - что делать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru