:: Visual Foxpro, Foxpro for DOS
winsock и порт > 32000
Василий
Автор

Сообщений: 682
Откуда: Москва
Дата регистрации: 19.10.2000
Добрый день

Возникла задача работать с ФР через сокет
Нашел в решениях замечательный класс от Влада Колосова для решения этой проблемы.
Он отлично работал до того момента пока порт для подключения не превысил значения 32000.

Подскажите знающие люди как исправить код чтобы можно было работать с портом боле 32000

метод подключения
LPARAMETERS cHost, nPort, nTimeOut
* cHost удалённый хост, имя или IP в интернет-нотации, строка
* nPort удалённый порт, число
* nTimeOut тайм-аут приема и передачи
IF EMPTY(nTimeOut)
nTimeOut = 5
ENDIF
LOCAL lRet, cBuf, nRetVal, nSockHandler, nSize, InBufSize, cBinIP, InBufSize, OutBufSize
* Подготовить приложение к использованию Winsock
cBuf = REPLICATE(CHR(0),WSADATA_SIZE)
nRetVal = WSAStartup(WS_VERSION,@cBuf)
IF nRetVal <> 0
ERROR 1
ELSE
This.WSAStarted = .T.
ENDIF
* Создать сокет
nSockHandler = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
IF nSockHandler = 0
ERROR 1
RETURN -1
ELSE
This.hSocket = nSockHandler
* Если сокет создан успешно, определить размер его буфера приема
cBuf = REPLICATE(CHR(0),4)
nSize = 4
IF getsockopt(nSockHandler,SOL_SOCKET,SO_RCVBUF,@cBuf,@nSize) = SOCKET_ERROR
ERROR 1
RETURN -1
ENDIF
InBufSize = CTOBIN(CREATEBINARY(SUBSTR(cBuf,1,nSize)),TRANSFORM(nSize)+'RS')
IF InBufSize <=0
ERROR 1
RETURN -1
ELSE
This.RecvBufferSize = InBufSize
ENDIF
OutBufSize = CTOBIN(CREATEBINARY(SUBSTR(cBuf,1,nSize)),TRANSFORM(nSize)+'RS')
IF OutBufSize <=0
ERROR 1
RETURN -1
ELSE
This.SendBufferSize = OutBufSize
ENDIF
ENDIF
cBinIP = This.getbinip(cHost)
IF EMPTY(cBinIP)
RETURN -1
ENDIF
cBuf = BINTOC(AF_INET,'2SR') + BINTOC(nPort,'2S') + cBinIP + REPLICATE(CHR(0),8)
lRet = connect(nSockHandler, @cBuf, LEN(cBuf))
IF lRet = SOCKET_ERROR
ERROR 1
RETURN -1
ENDIF
RETURN This.SetTimeout(nTimeOut)

тупо поменять строку
cBuf = BINTOC(AF_INET,'2SR') + BINTOC(nPort,'2S') + cBinIP + REPLICATE(CHR(0),8)
на
cBuf = BINTOC(AF_INET,'2SR') + BINTOC(nPort,'4S') + cBinIP + REPLICATE(CHR(0),8)
эффекта не дало.
Что еще требуется изменить в коде.
Ratings: 0 negative/0 positive
Re: winsock и порт > 32000
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для unsigned short (каковым должен быть номер порта в структуре) подойдёт выражение
BINTOC(m.nPort-32768,'2')
Параметры функции BINTOC в фоксе несколько неочевидны... В частности она ВСЕГДА трактует передаваемые ей числа как знаковые, а модификатор 'S' просто инвертирует старший (знаковый) бит в получаемом наборе байт.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: winsock и порт > 32000
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Можно еще правую часть брать от 4S:
? 0h + BINTOC(33000-32768,'2')
? 0h + RIGHT(BINTOC(33000,'4S'),2)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика