Что нового

TCP_Send и работа с ним

Arei

Скриптер
Сообщения
938
Репутация
115
Скажите есть скрипты


TCP_RECEIVE.au3
Код:
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassEnc.au3"
#include "BassExt.au3"

$sIPADDRESS = "127.0.0.1"
$iPORT = 8080

OnAutoItExitRegister("_FreeBass")

_BASS_Startup()
_BASS_ENCODE_Startup()
_BASS_EXT_STARTUP()

_BASS_Init(0, -1, 44100, 0, "")

$hStream = 0

$aBuffer=_BASS_EXT_MemoryBufferCreate()

TCPStartup()
$ConnectedSocket = TCPConnect($sIPADDRESS, $iPORT)
If $ConnectedSocket = -1 Then
	MsgBox(0,"",@error)
	Exit
EndIf


While 1

	$bMp3Data=TCPRecv($ConnectedSocket,4096*2)
	If BinaryLen($bMp3Data) > 0 Then
		_BASS_EXT_MemoryBufferAddData($aBuffer, $bMp3Data)
		If Not $hStream And _BASS_EXT_MemoryBufferGetSize($aBuffer) > 4096 Then
			$hStream=_BASS_StreamCreateFileUser($STREAMFILE_BUFFERPUSH, BitOR($BASS_STREAM_RESTRATE, $BASS_STREAM_BLOCK), $BASS_EXT_FILEPROCS, $aBuffer[2])
			_BASS_ChannelPlay($hStream, 1)
		EndIf
	EndIf
	ToolTip("TCP_REICIVE Buffer size: " & _BASS_EXT_MemoryBufferGetSize($aBuffer))
	If $hStream And _BASS_EXT_MemoryBufferGetSize($aBuffer) >= 4096 Then _BASS_EXT_StreamPutFileBufferData($hStream, $aBuffer)

	Sleep(50)
WEnd


Func _EXIT()
	Exit
EndFunc

Func _FreeBass()
	TCPCloseSocket($ConnectedSocket)
	TCPShutdown()
	_BASS_Free()
EndFunc


и
TCP_SEND.au3

Код:
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassEnc.au3"
#include "BassExt.au3"

$sIPADDRESS = "127.0.0.1"
$iPORT = 8080

OnAutoItExitRegister("_FreeBass")

HotKeySet("{ESC}","_EXIT")

_BASS_Startup()
_BASS_ENCODE_Startup()
_BASS_EXT_STARTUP()

_BASS_RecordInit(-1)
$hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc)

$aBuffer=_BASS_EXT_MemoryBufferCreate()
$hEncoder = _BASS_Encode_Start($hRecord, @ScriptDir & '\lame -r -x -b128 -h - -', 0, $BASS_EXT_EncodeProc, $aBuffer[0])

TCPStartup()
$iSocket = TCPListen($sIPADDRESS, $iPORT)

$iPid=Run(@ScriptDir & "\TCP_receive.exe")

$iAcceptSocket=-1
While 1
	If $iAcceptSocket = -1 Then
		$iAcceptSocket=TCPAccept($iSocket)
		$iData=_BASS_EXT_MemoryBufferGetSize($aBuffer)
		_BASS_EXT_MemoryBufferGetData($aBuffer, $iData) ; solange keine Verbindung besteht -> buffer leeren
		ContinueLoop
	EndIf

	$iData=_BASS_EXT_MemoryBufferGetSize($aBuffer)
	If $iData Then
		$bMp3Data = _BASS_EXT_MemoryBufferGetData($aBuffer, $iData)
		$iSent=TCPSend($iAcceptSocket, $bMp3Data)
		ConsoleWrite("Bytes: " & BinaryLen($bMp3Data) & " / gesendet: " & $iSent & @CRLF)
	EndIf

	Sleep(50)
WEnd



Func _EXIT()
	Exit
EndFunc

Func _FreeBass()
	ProcessClose($iPid)
	TCPCloseSocket($iAcceptSocket)
	TCPShutdown()
	_BASS_Encode_Stop($hEncoder)
	_BASS_RecordFree()
	_BASS_Free()
EndFunc


что нужно сделать и какие файлы передать,что бы я мог разговаривать с человеком с другого компа? и какие ip вписать при этом, мои или его?

файл более 200r,====== http://depositfiles.com/files/mkrbj4zbg
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Arei [?]
и какие ip вписать при этом, мои или его
TCPListen это серверная сторона, нужен внешний IP этого компа, можно получить через
Код:
#include <INet.au3>
_GetIP()

Но если комп за ADSL-роутером, то адрес выдаст неверный и придется ручками прописывать.
А клиент TCPConnect ему нужно как-то сообщить этот адрес для соединения :smile:

Первый скрипт постоянно принимает поток из сети, преобразует и проигрывает как звук, а второй скрипт непрерывно записывает звук и передает с сеть.
Симплексная связь получается :smile:
Так что придется дублировать скрипты для полноценного дуплекса (+ писать другой порт) или придумывать механизм переключения в режим передачи/приема
Как вариант - walke-talkie:
Пока нажата кнопка - включен режим передачи.
Кнопку отпустили - включен режим приема.

С текстом проще - данных мало и он передается быстро, поэтому можно почти одновременно передавать и принимать.
чатик
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
а если использовать.@IPAddress2?или я неправильно понял?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Arei [?]
а если использовать.@IPAddress2?или я неправильно понял?
@IPAddress выдает внутренний (серый)адрес, обычно это 10.**** и этот адрес действует в пределах подсети твоего провайдера. А для выхода в интернет, чаще всего, создается vpn подключение, которое тебе предоставляет провайдер, и для этого подключения твой адрес будет совсем другим что-то типа 192.**** (белый). Дак вот чтобы его получить и нужно использовать _GetIP().
Посмотри свой @IPAddress и адрес, который тебе выдаст http://www.ip-1.ru.

Думаю есть и другие способы чтобы его узнать (покопаться в настройках), но этот проще.

Есть конечно варианты, что ты подключен к Inetren напрямую :smile:, тогда да @IPAddress выдаст нужную информацию. Этот же вариант работает, если ты собираешься общаться внутри локальной сети.
 

HungryDwarf

Новичок
Сообщения
35
Репутация
3
@IPAddress выдает внутренний (серый)адрес, обычно это 10.**** и этот адрес действует в пределах подсети твоего провайдера. А для выхода в интернет, чаще всего, создается vpn подключение, которое тебе предоставляет провайдер, и для этого подключения твой адрес будет совсем другим что-то типа 192.**** (белый).
мне казалось, все наоборот. если вы в консоли наберете ipconfig, то получите свой внутренний ип вида 192.168.*.* а на сайте вроде www.ip-1.ru или 2ip.ru вам покажется ваш внешний.

у меня например вебморда роутера висит по адресу 192.168.1.1
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
HungryDwarf
Если вы выходите в Интернет через router, то @IPAddress будет показывать ваш IP который вам назначил router, а именно 192.168.х.х
ip-1.ru или 2ip.ru вам покажут ваш IP, который назначен вашему router`у провайдером.
 

HungryDwarf

Новичок
Сообщения
35
Репутация
3
именно это я имел ввиду, спасибо за внятное разъяснение
OffTopic:
сарказма ноль, честно
 
Верх