Додумался сам, вот что получилось:
Сервер:
Код:

#include <GUIConstantsEx.au3>
Global $IPAdress = @IPAddress1, $port = 3391, $ConnectedSocket[50], $szIP_Accepted, $i, $msg, $all_user = 50
TCPStartup()
$MainSocket = TCPListen($IPAdress, $port)
If $MainSocket = -1 Then Exit MsgBox(16, "error", "$MainSocket = " & $MainSocket)
; Create a GUI for messages
;==============================================
$GOOEY = GUICreate("My Server (IP: " & $IPAdress & ")", 300, 200)
$edit = GUICtrlCreateEdit("Мой сервер версия 1.0.0.1", 10, 10, 280, 180)
GUICtrlSetState($edit, $GUI_DISABLE)
GUISetState()
For $i = 1 To $all_user - 1 Step + 1
$ConnectedSocket[$i] = -1
Next
While 1
For $i = 1 To $all_user - 1 Step + 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
If $ConnectedSocket[$i] = -1 Then
$ConnectedSocket[$i] = TCPAccept($MainSocket)
If $ConnectedSocket[$i] <> -1 Then GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " подключен")
EndIf
$recv = TCPRecv($ConnectedSocket[$i], 2048)
If @error And $ConnectedSocket[$i] <> -1 Then
$ConnectedSocket[$i] = -1
GUICtrlSetData($edit, GUICtrlRead($edit) & @CRLF & "ID = " & $i & " отключен!")
EndIf
If $recv <> "" And Not @error Then GUICtrlSetData($edit, _
GUICtrlRead($edit) & @CRLF & "ID = " & $i & " IP = " & SocketToIP($ConnectedSocket[$i]) & " > " & $recv)
Next
WEnd
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
Клиент:
Код:

#include <GUIConstantsEx.au3>
Opt('MustDeclareVars', 1)
Global $ConnectedSocket = -1, $szData
Global $szIPADDRESS = "10.10.14.153"
Global $nPORT = 3391
TCPStartup()
$ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
Else
While 1
$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
If @error Or $szData = "" Then ExitLoop
TCPSend($ConnectedSocket, $szData)
If @error Then ExitLoop MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
WEnd
EndIf
Только вот эти функции для определения IP, не одна не работают:
Первая:
Код:

Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "ptr", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
Вторая:
Код:

Func SOCKET2IP($SHOCKET)
Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")
$a = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET,"ptr",DLLStructGetPtr($sockaddr), _
"int_ptr",DLLStructGetSize($sockaddr))
If Not @error And $a[0] = 0 Then
$a = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
If Not @error Then $a = $a[0]
Else
$a = 0
EndIf
; release Struct not really needed as it is a local
$sockaddr = 0
Return $a
EndFunc ;==>SOCKET2IP
Помогите пожалуйста разобраться с этими функциями. Почему они не работают? Я в DLL 0.
И ещё всётаки как сделать двухстороннюю связь не открывая второго порта? Это вне моего понимания, приведу пример:
сервер голосового чата Ventrilo установлен на компьютере IP адрес которого виден из вне, а клиент коннектится к серверу с компьютера IP адрес которого виден только из локальной сети, дак каким же образом они обмениваются данными если сервер физически не сможет приконнектиться к клиенту т.к. его IP адрес не виден из вне? примерно тоже самое хочется сделать на Autoit.
Заранее спасибо!