Дайте подсказку в нужном направлении (Winsock API)

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

Дайте подсказку в нужном направлении (Winsock API)

Сообщение Craft » 03.12.2004 (Пт) 1:34

Пользовался WinSock контролом и хватало его на все. Теперь пришлось писать свой Winsock на API. Сложный сокет не нужен, поэтому "большие" листинги и классы не используются, да и не нужны:

UDP Socket на порт (например 12345). И отправляет и принимает данные (на любой IP и с любого IP).

Запуск всего делаю так:
Код: Выделить всё
    'инициализация сокета
    errRet = WSAStartup(WINSOCK_V22, wsStruct)

    'проверка на ошибки
    . . .

    'создание сокета
    handleWS = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)

    'проверка на ошибки
    . . .

    'биндим сокет
    socketAddr.sin_family = AF_INET
    socketAddr.sin_addr = inet_addr("0.0.0.0")
    socketAddr.sin_port = htons(12345)
    socketAddr.sin_zero = String(8, vbNullChar)
           
    errRet = bind(handleWS, socketAddr, Len(socketAddr))

    'проверка на ошибки
    . . .

    'далее делаю событие, но что бы просто и быстро, на невидимую кнопку
    errRet = WSAAsyncSelect(handleWS, CommandRecv.hwnd, WM_MOUSEMOVE, FD_READ + FD_WRITE)


Это стартовая часть. Она отрабатывает без проблем. Далее отправка, которая тоже без проблем идет:
Код: Выделить всё
    'отправляю себе же (в локалке)
    data2send.sin_family = AF_INET
    data2send.sin_addr = inet_addr("192.168.0.1")
    data2send.sin_port = htons(12345)
    data2send.sin_zero = String(8, vbNullChar)
    temp = "Сообщение!!!"
   
    errRet = sendto(handleWS, temp, Len(temp), 0, data2send, Len(data2send))


Возникает событие в CommandRecv, которое обрабатываю так:
Код: Выделить всё
    data2recv.sin_family = AF_INET
    data2recv.sin_addr = inet_addr("0.0.0.0")
    data2recv.sin_port = htons(0)
    data2recv.sin_zero = String(8, vbNullChar)
    buffData = String(512, vbNullChar)
    buffLen = 512
       
    errRet = recvfrom(handleWS, buffData, buffLen, 0, data2recv, Len(data2recv))


Вот как раз на последней строчке кода программа уходит в "аут". Ждать приходится до 30 секунд. Реакции ни какой. Событие точно ловится. Проверял, Beep вместо этого кода ставил. Отправка идет корректно - количество отправленных байт совпадает.

Нужна помощь в этом деле. Желательно с разъяснением. :wink:

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

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

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

    TopList