Mach das ganze doch besser über ein COM-Objekt. Du solltest dir dazu mal das Hieransehen.
Gruss Shadowigor
Mach das ganze doch besser über ein COM-Objekt. Du solltest dir dazu mal das Hieransehen.
Gruss Shadowigor
Das stimmt so nicht. Sind noch ein paar Fehler da. Richtig ists so:
[autoit]Local $sRecv = ""
[/autoit][autoit][/autoit][autoit]Do
$sRecv &= TCPRecv ($Socket, 4096) ; &= damit alles aneinandergehängt wird
Until $Recv = "" ; Man will ja warten bis nichts mehr kommt
FileWrite (@DesktopDir & "\TestWave.wav", $sRecv)
SoundPlay (@DesktopDir & "\TestWave.wav", 1)
Gruss Shadowigor
Also bei der 2. Variante verschickst du eine Variable die dort gar nicht existiert. Was du bei der ersten Variant aber machen willst scheint mir etwas schleierhaft. Wieso verschickst du denn das Handle? Ist das nur ein Schreibfehler? Wenn nein, weis ich nicht was du damit anfangen willst. Denn dem Empfänger wird dein Handle rein gar nichts bringen.
Gruss Shadowigor
Lass dir mal $line anzeigen. Denn eigentlich müsste es gehen. Wenn das stimmt mach mal ein ASCII-Array draus und prüf das. Vielleicht sind noch wo nicht-druckbare Zeichen.
PS. Hab schon mal sowas geschrieben (Hier).
Gruss Shadowigor
_StringBetween($sDeinString, "User-Agent:", @CRLF)
Gruss Shadowigor
Das Programm schliesst sich automatisch wenn er #RequireAdmin ablehnt.
Gruss Shadowigor
Also kurz nochmal zu den Punkten:
1. Ich nahm an dass das so sein sollte. Aber wenn du "ende" gesendet hast hat er nur das Socket geschlossen, die Schleife ist aber weitergegangen.
2. Listen ist nur einmal vor dem verbinden nötig. danach musst du accept in eine schleife packen bis sich der client connected hat. Dann geht das Script ganz normal weiter
Beispiel:
TCPStartup()
$idListen = TCPListen(@IPAddress1, 50000)
Do
$idSocket = TCPAccept($idListen)
Until $idSocket <> -1
; Dann geht das Script weiter
Nun zu deinem Problem mit dem File:
FileRead liest immer die nächsten z.B. 2048 Zeichen ein. Dafür musst du es aber mit FileOpen öffnen. Sonst fängt er immer wieder von vorne an.
Also kannst du das in eine Schleife packen:
$hFile = FileOpen("Pfad zur Datei", 0) ; Öffnet die Datei im Lese-Modus (0)
Do
$sText = FileRead($hFile, 2048) ; Liest immer die nächsten 2048 Zeichen ein
TCPSend($idSocket, $sText) ; und sendet diese
Until $sText = "" ; Widerholt das bis das Ende des Files erreicht ist
Ich hoffe ich konnte dir helfen.
Gruss Shadowigor
Klar geht das nicht:
1. Du kommst gar nie aus dieser Schleife (Server).
2. In der schleife machst du jedes mal Listen und accept.
3. Du liest nur die ersten 2048 Zeichen ein die du dann verschickst.
4. Du hast beim Client keine Schleife beim TCPRecv (der wartet nicht von alleine bis was kommt).
(5. Das Sleep ist nicht nötig)
(6. Es ist einfacher wenn di @IPAddress1 nimmst bei TCPListen)
Ich finde das sind schon recht viele Punkte. Korrigier die mal und dann sehen wir weiter.
Gruss Shadwigor
Meinst du mit Daten Dateien?
Versuchs mal mit ControlClick. Vielleicht klappts so besser.
Gruss Shadowigor
Hallo Leute
Ich hab mal ne kleine TCP-Dll geschrieben (zum Test. Wird noch erweitert) und wollte Sie testen. Also die Dll wird definitiv ausgeführt. Das hab ich rausgefunden indem ich ne MessageBox in die Dll eingefügt habe und die wurde auch aufgerufen ^^. Die MsgBox meines AutoIt Scripts wurde aber leider nicht angezeigt :pinch:. Das Script läuft erfolgreich bis ein return in der Dll kommt. Dann läuft es noch ein wenig und hängt sich dann auf ohne MsgBox.
Hier das Script:
$hDll = DllOpen($sPath) ; Und ja $sPath habe ich definiert ; )
$aSocket = DllCall($hDll, "int", "StartupClient", "str", @IPAddress1, "int", 50000)
MsgBox(0, "Return", @error)
DllClose($hDll)
Exit
Und die Dll:
#pragma comment(lib, "Ws2_32.lib")
#include <WinSock2.h>
#include <Windows.h>
SOCKET idSocket[1];
char *szBuf;
int i = 0;
extern "C" int __declspec(dllexport) StartupClient (char *sIP, int iPort)
{
WSADATA wsa;
SOCKET* idSocket = new SOCKET[i++];
SOCKADDR_IN tAdr;
WSAStartup(MAKEWORD(2,0), &wsa);
idSocket[i] = socket(AF_INET, SOCK_STREAM, 0);
if(idSocket[i] == INVALID_SOCKET)
return 0 - WSAGetLastError();
memset(&tAdr, 0, sizeof(SOCKADDR_IN));
tAdr.sin_family = AF_INET;
tAdr.sin_port = htons(iPort);
tAdr.sin_addr.s_addr=inet_addr(sIP);
if(connect(idSocket[i], (SOCKADDR*) & tAdr, sizeof(SOCKADDR)) == SOCKET_ERROR)
return 0 - WSAGetLastError();
// sprintf (buffer, "%i", WSAGetLastError());
// MessageBoxA(NULL, (LPCSTR)buffer, "", 0);
return i;
}
extern "C" int __declspec(dllexport) StartupServer (int iPort)
{
WSADATA wsa;
SOCKET idSocketListen;
SOCKET* idSocket = new SOCKET[i++];
SOCKADDR_IN tAdr;
WSAStartup(MAKEWORD(2,0), &wsa);
idSocketListen = socket(AF_INET,SOCK_STREAM,0);
memset(&tAdr, 0, sizeof(SOCKADDR_IN));
tAdr.sin_family = AF_INET;
tAdr.sin_port = htons(iPort);
tAdr.sin_addr.s_addr = INADDR_ANY;
if(bind(idSocketListen, (SOCKADDR*) & tAdr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
return 0 - WSAGetLastError();
if(listen(idSocketListen, 10) == SOCKET_ERROR)
return 0 - WSAGetLastError();
idSocket[i] = accept(idSocketListen, NULL, NULL);
if(idSocket[i] == INVALID_SOCKET)
return 0 - WSAGetLastError();
return i;
}
extern "C" int __declspec(dllexport) TCPSend (int j, const char *szToSend)
{
if(send(idSocket[j], szToSend, strlen(szToSend), 0) == SOCKET_ERROR)
return 0 - WSAGetLastError();
return 1;
}
extern "C" char __declspec(dllexport) *TCPRecv (int j, const int iLen)
{
szBuf = new char[iLen];
if(recv(idSocket[j], szBuf, iLen, 0) == SOCKET_ERROR)
return 0;
return szBuf;
}
extern "C" void __declspec(dllexport) TCPShutdown (SOCKET idSocket)
{
closesocket(idSocket);
WSACleanup();
return;
}
Alles anzeigen
Hat wer ne Idee woran das liegt?
Gruss Shadowigor
Auch von mir alles gute! ![]()
Also. Erstens sollte dein TCPRecv eigentlich gar nie einen @error auslösen wenn alles richtig läuft. Der käme höchstens wenn du das Client Socket schliesst (bin ich mir nicht sicher).
Ausserdem bin ich mir nicht ganz sicher ob du bei Listen nicht die öffentliche IP angeben musst (_GetIP()). Damit hab ich selber noch so meine Probleme...
Versuch mal das zu ändern. Wenns dann immer noch nicht funktioniert, muss ichs mir noch mal anschauen ob ich noch was finde.
Gruss Shadowigor
So z.B.:
$sString = _StringBetween($sende1, "$GPRMC", "$")
Gruss Shadowigor
$ipX ist schon die IP. Die musst du nicht mit TCPNameToIP auflösen.
Also so wie ich das sehe, sollte sich dein GUI und das Programm schliessen, sobald kein Ereignis mehr stattfindet (Case 0). Ist das gewollt?
Sonst siehts gut aus. Wann soll er denn den zweiten Case ausführen?
EDIT: Ok, so funktionierts auch.
Dann nimmst du am besten ein leeres Label und machst es mit GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) Transparent, wenn es das ist was du suchst.