Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2012, 15:09   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию WinSock 2-порта

Есть ли у кого пример создания в одной программе два TCP сокета на прослушивание на разных портах. Для одного порта просто:

MASM:
Код:
    invoke WSAStartup,202h,addr wsadata
    .IF (EAX != 0)
        JMP JError
    .ENDIF
    invoke socket,AF_INET,SOCK_STREAM,0
    .IF (EAX < 0)
        JMP JError
    .ENDIF
    MOV sock,eax                                 
    invoke WSAAsyncSelect,sock,hwnd,WM_SOCKET,FD_ACCEPT+FD_READ+FD_CLOSE
    MOV sin.sin_family,AF_INET
    invoke htons,Port
    MOV sin.sin_port,ax
    MOV sin.sin_addr,INADDR_ANY
    invoke bind, sock,addr sin,sizeof sin
    .IF (EAX != 0)
        JMP JError
    .ENDIF
    invoke listen,sock,SOMAXCONN
    .IF (EAX != 0)
        JMP JError
    .ENDIF
И после обрабатывая сообщения FD_ACCEPT FD_READ FD_CLOSE в оконной процедуре. Но для двух сокетов надо уже писать свои потоки. Но как тогда различать сообщения, пришедшие на разные сокеты? Поделитесь примером, а то я что-то никак...
hiho вне форума Ответить с цитированием
Старый 06.01.2012, 22:47   #2
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Попробовал переписать с использованием потоков, получилось вот так:
Код:
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\wsock32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\shell32.lib

CreateSocket PROTO :DWORD

.DATA 
    WSA         WSADATA <>
.CODE

start: 

    ; Шаг 1 - Инициализация Библиотеки Сокетов
    
    INVOKE WSAStartup, 202h, addr WSA
    .IF (EAX)
        JMP JErr;
    .ENDIF
    INVOKE CreateSocket, 6677 
    JErr:
        INVOKE WSACleanup
        INVOKE ExitProcess, 0       

ClientThread PROC Sock  : SOCKET
    LOCAL Bytes         : DWORD
    LOCAL BufStr[1024]  : BYTE
    .REPEAT
        INVOKE recv, Sock, addr BufStr, sizeof BufStr, 0
        MOV Bytes, EAX
        INVOKE MessageBox,0,addr BufStr,0,0
    .UNTIL (Bytes <= 0)
    INVOKE closesocket, Sock
ClientThread ENDP

CreateSocket PROC Port :DWORD
    LOCAL Sock      : SOCKET
    LOCAL Client    : SOCKET
    LOCAL sin       : sockaddr_in
    LOCAL thID      : DWORD
    ; Шаг 2 - создание сокета
    
    INVOKE socket, AF_INET, SOCK_STREAM, 0
    .IF (EAX < 0)
        JMP JErr;
    .ENDIF
    
    ;Шаг 3 - связывание сокета с локальным адресом
    
    MOV Sock, EAX                                 
    MOV sin.sin_family, AF_INET
    INVOKE htons, Port 
    MOV sin.sin_port, AX
    MOV sin.sin_addr, INADDR_ANY

    ; Вызываем bind для связывания
    INVOKE bind, Sock, addr sin, sizeof sin
    .IF (EAX != 0)
        JMP JErr
    .ENDIF

    ;Шаг 4 - ожидание подключений
    
    INVOKE listen, Sock, SOMAXCONN
    .IF (EAX)
        JMP JErr
    .ENDIF
    
    ;Шаг 5 - извлекаем сообщение из очереди

    .REPEAT
        INVOKE accept, Sock, 0, 0
        MOV Client, EAX
        INVOKE CreateThread, 0, 0, addr ClientThread, Client, 0, addr thID
    .UNTIL (Client == 0)
CreateSocket ENDP

END start
Но после нескольких коннектов\дисконнектов вылетает. Никак не могу найти где ошибка, помогите
hiho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подслушка com-порта yuta_86 Общие вопросы Delphi 4 14.12.2010 16:21
тестирование com-порта kosstil Помощь студентам 1 31.03.2010 09:13
Настройка COM порта zombi Win Api 1 05.11.2008 19:02
Как получить данные с COM-порта или другого любого порта? DeLure Общие вопросы C/C++ 5 20.09.2007 00:50