Ошибка при использовании winsock =(

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hart
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 04.12.2003 (Чт) 22:44

Ошибка при использовании winsock =(

Сообщение hart » 04.12.2003 (Чт) 22:49

Пишет:
WSAEADDRINUSE (10048) Address already in use.
Ошибка возникает при ВТОРОМ запуске этого кода:

Код:
Winsock1.Close
On Error GoTo err
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = "pop.mail.ru"
Winsock1.RemotePort = 110
Winsock1.Connect
WaitFor ("+OK")
Winsock1.SendData "USER " & "nik" & vbCrLf
WaitFor ("+OK")
Winsock1.SendData "PASS " & "pass" & vbCrLf
WaitFor ("+OK")
Winsock1.SendData ("LIST" + vbCrLf)
answer = WaitReply
If Val(Left(answer, 1)) < 1 Then
Winsock1.SendData ("QUIT" + vbCrLf)
WaitFor ("+OK")
Winsock1.Close
recieveCMD = "exit"
Exit Function
End If
Winsock1.SendData "TOP 1 0" & vbCrLf
answer = WaitReply

...

err:
Winsock1.SendData ("QUIT" + vbCrLf)
WaitFor ("+OK")
Winsock1.Close


Помогите пожалуйста убрать баг!
Заранее спасибо,
Константин.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 05.12.2003 (Пт) 0:34

дорогой мой товарищь!

Если ты поставишь машину на парковку ... и забежишь в магазин на пару минут а увидев обнаружишь, что твой автомобиль находится под вторым ....

что ты сделаешь - пойдешь к водителю второго автомобиля - а он тебе в ответ - так это же парковка:)

Решение - когда ты занял порт, он уже не свободен ... НЕ НАЗНАЧАЙ дважды 110 порт ... :) он уже назначен ... а если так хочется тогда сначала скинь значение например с 110 на 0 а потом снова на 110 поствишь :)
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

hart
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 04.12.2003 (Чт) 22:44

Сообщение hart » 05.12.2003 (Пт) 1:11

Я перенес
Winsock1.Protocol = sckTCPProtocol
Winsock1.RemoteHost = "pop.mail.ru"
Winsock1.RemotePort = 110
в form_load, а из этой функции убрал.
При этом ошибка не пропала =(

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 05.12.2003 (Пт) 15:31

Мне кажется, что переносить не обязательно - ведь есть же Winsock1.Close - а значит, сокет (слот) закрывается, освобождая порт... И он становится свободным...

А, может, надо использовать метод bind? :roll: Связывая в Form_Load pop.mail.ru и порт 110?

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 06.12.2003 (Сб) 0:14

а почему именно так
Код: Выделить всё
While Winsock1.State <> sckClosed
    Winsock1.Close
Wend

ведь куда проще ...
Код: Выделить всё
If Winsock1.State <> 0 then Winsock1.Close

.... это так к слову ..
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

hart
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 04.12.2003 (Чт) 22:44

Сообщение hart » 06.12.2003 (Сб) 1:40

Насколько я понял, Close требует определенного времени, именно поэтому.
С той проблемой все еще не разобрался :(

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 06.12.2003 (Сб) 13:27

hart У меня аналогичная трабла, тока я использую ZClientServer, но он на основе WinSock'а, так вот, из личных наблюдений, при закрытии проги выдаётся ошибка, а если сначала нажать на кнопочку с функцией дисконнект, а потом тут-же закрыть прогу, всё парит!!! Пробывал делать цикл задержки, увы, не помогает! :( Я думаю, ещё не пробывал, нужно перенести разрыв соединения в отдельную функцию, а в Unload_Form1 зпихнуть чё-то типа:
Код: Выделить всё
Call disc

Где disc и есть функция с разрывом соединеия......

hart
Начинающий
Начинающий
 
Сообщения: 19
Зарегистрирован: 04.12.2003 (Чт) 22:44

Сообщение hart » 06.12.2003 (Сб) 18:00

Все решается добавлением "Winsock1.LocalPort = 0" до коннекта.
Это действие подготавливает для коннекта рандомно любой из свободных портов. Как показала практика, по команде Close порты сразу не освобождаются.
Можно закрывать конфу.

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 06.12.2003 (Сб) 21:53

hart Как-бы тебе сказать, понимаю, что тебя это не колышит, но в моём случае используется строго 3388 порт и сменить его можно тока переписав pcx фаил :D Одним словом: влип я!!!! А вообще, с чем это связанно? При разрыве кодом -всё работает, а при закрытии проги - летит нафиг!?


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList