Übergabe an Thread
-
Wenn man casten muss, dann ist das immer ein schlechtes Zeichen!
Deshalb: Lass das casten weg und mach:DWORD WINAPI Connection(void);und
handle=CreateThread(0,0, Connection,(LPVOID)&structname ,0,&id);
-
Hallo,
danke für die Antwort,
was bewirkt "DWORD WINAPI"? (nicht schlagen gg)
mfg
-
DWORD ist der Rückgabetyp
typedef unsigned long DWORD;und WINAPI kümmert sich um die Calling-Convention.
(also was die Parameter und so angeht, aber das geht dann schon in den Bereich Assembler)#define WINAPI __stdcall // Standard ist __cdecl // es gibt auch noch __fastcall
-
-
Was für ein Fehler? und was für ein Problem?
-
Vielleicht könntest du erstmal sagen, WAS nicht funktioniert. Nimmt der Compiler den Code nicht(könnte ich mir vorstellen) oder passiert im Programm einfach nix?
-
Wenn ich Dir mal was (fast) ganz anderes vorschlagen
:
Warum nimmst Du nicht die WinInet-API, da ist schon alles in Threads gepackt! Da bekommste dann ne Nachricht, wenn was spezielles passiert (Daten angekommen, Connect erfolgreich, usw. ...).
-
Das Problem ist,dass ich nicht weiss WAS ich machen soll/muss.
Ich will einen eigenen Thread nur fürs connecten machen.
Muss ich jetzt das Struct dass die beiden anderen Structs beinhaltet NUR an den Thread übergeben ODER auch an die Funktion übergeben.
Hmm Thx das schau ich mir gleich mal an.
Wär trotzdem froh wenn ich wüsste wie ichs ohne WinInet API mach
Lg
-
Wenn du den Thread nur fürs connecten benutzen willst: warum initialisiert du die ganzen structs nicht einfach in deinem Thread und lässt deine WinMain damit in Ruhe?!
-
#pragma comment( lib, "ws2_32.lib" ) #include <winsock2.h> #include <winsock.h> #include <stdio.h> #include <time.h> #include <windows.h> #include <stdio.h> DWORD WINAPI Connection(void) { SOCKET ProtoClient; SOCKADDR_IN ProtoAddress; ProtoClient=socket(AF_INET,SOCK_STREAM,0); memset(&ProtoAddress,0,sizeof(SOCKADDR_IN)); ProtoAddress.sin_family=AF_INET; ProtoAddress.sin_port=htons(12345); ProtoAddress.sin_addr.s_addr=ADDR_ANY; struct Sockets { SOCKET Client; SOCKADDR_IN Address; } structname; structname.Client=ProtoClient; structname.Address=ProtoAddress; connect(structname.Client,(SOCKADDR*)&structname.Address,sizeof(SOCKADDR)); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInstance_2, LPSTR CmdLine, int Show ) { unsigned long int id=1; //Diese Daten möchte ich jetzt an den Thread übergeben HANDLE handle; handle=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Connection,(LPVOID)&structname ,0,&id); return 0; }k nur jetzt hab ich (auch wenns sicher n triviales Problem ist) das Problem, dass structname nur in Connection gültig ist.
Lg
-
Global deklarieren?
-
Ich glaube Du musst Dir zuerst mal selber im klaren werden was Du willst, bevor Du hier weiter fragen stellen kannst...
In Deinem Thread ist überhaupt nichts klar. Weder warum Du einen Thread machen willst, noch was Du mit der Socket-Verbindung überhaupt anstellen willst...
Also: Erklär zuerst mal was Du machen willst, bevor Dir irgendwer überhaupt sinnvoll weiterhelfen kann...
-
Hallo,
rofl
also erstens weiss ich GENAU was ich will,
ich habe es auch schon genau drei Mal beschrieben.egal, danke für eure Antworten, ich probiers einfach so lang weiter bis es irgendwann klappt.
Alles was ich jetzt will ist dass die structs auch in der anderen Funktion bekannt sind.
Global deklarieren funzt nicht:I:\Programme\PellesC\Projects\Threading\threading-2.c(20): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(20): error #2120: Redeclaration of 'ProtoClient' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(17): found 'int' expected 'unsigned int'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(20): error #2069: Initializer must be constant.
I:\Programme\PellesC\Projects\Threading\threading-2.c(22): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2001: Syntax error: found '&' - expecting ')'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2120: Redeclaration of 'memset' previously declared at I:\Programme\PellesC\Include\string.h(22): found 'int __cdecl function' expected 'void * __cdecl function(void *, int, unsigned int)'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(22): error #2001: Syntax error: found ')' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(24): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(24): error #2120: Redeclaration of 'ProtoAddress' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(18): found 'int' expected 'struct sockaddr_in'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(24): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(24): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(25): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(25): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(25): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(25): error #2069: Initializer must be constant.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(26): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(35): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2120: Redeclaration of 'structname' previously declared at I:\Programme\PellesC\Projects\Threading\threading-2.c(33): found 'int' expected 'struct Sockets'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(35): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(35): error #2069: Initializer must be constant.
I:\Programme\PellesC\Projects\Threading\threading-2.c(36): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(36): error #2001: Syntax error: found '.' - expecting ';'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(36): warning #2099: Missing type specifier.
I:\Programme\PellesC\Projects\Threading\threading-2.c(36): error #2069: Initializer must be constant.
I:\Programme\PellesC\Projects\Threading\threading-2.c(64): error #2113: Left operand of . has incompatible type 'int'.
I:\Programme\PellesC\Projects\Threading\threading-2.c(64): error #2113: Left operand of . has incompatible type 'int'.
*** Error code: 1 ***
Done.
-
Versuchs mal damit:
#pragma comment( lib, "wsock32.lib" ) #include <stdio.h> #include <time.h> #include <windows.h> typedef struct _Sockets { SOCKET Client; SOCKADDR_IN Address; } Sockets; Sockets structname; DWORD WINAPI Connection(void) { SOCKET ProtoClient; SOCKADDR_IN ProtoAddress; ProtoClient = socket(AF_INET,SOCK_STREAM,0); memset(&ProtoAddress,0,sizeof(SOCKADDR_IN)); ProtoAddress.sin_family = AF_INET; ProtoAddress.sin_port = htons(12345); ProtoAddress.sin_addr.s_addr = ADDR_ANY; structname.Client = ProtoClient; structname.Address = ProtoAddress; connect(structname.Client, (SOCKADDR*)&structname.Address, sizeof(SOCKADDR)); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInstance_2, LPSTR CmdLine, int Show ) { DWORD id; HANDLE handle = CreateThread(0, 0, &Connection, 0, 0, &id); return 0; }Müsste funzen(nicht getestet).
-
Ich will doch NUR wissen LOL ob ich wenn ich einen Thread starte der eine Funktion abarbeitet, es reicht nur dem Thread die vars zu geben oder auch der Fubnktion die die vars braucht.
Mehr will ich ned wissen
-
ah 2 secs nach dir gepostet gg.
Vielen Dank ich probiers gleich mal
-
Hmm schade, nein funzt leider auch ned.
Mir fällt echt ned ein wie ich das lösen könnte...
-
Hab mir deinen Code nochmal genauer angeguckt:
ProtoAddress.sin_family = AF_INET; ProtoAddress.sin_port = htons(12345); ProtoAddress.sin_addr.s_addr = ADDR_ANY; ... connect(structname.Client, (SOCKADDR*)&structname.Address, sizeof(SOCKADDR));Was willst du damit eigentlich erreichen? Du füllst die struct wie für einen Server und verbindest dann mit connect wie ein Client?!
Guck dir das hier nochmal an: http://www.c-worker.ch/tuts.php
-
Hi!
Danke, is mir in der Nacht bei der Fehlersuche auch aufgefallen.
gg
-
Hi Leute!
Hmm das ist jetzt der neue Code, einziges Problem ist nur noch die Übergabe in Zeile 28 und 29.
#pragma comment( lib, "ws2_32.lib" ) #include <winsock2.h> #include <winsock.h> #include <stdio.h> #include <time.h> #include <windows.h> #include <stdio.h> struct _Sockets { SOCKET Client; SOCKADDR_IN Address; }; DWORD WINAPI Connection(struct _Sockets *structname) { SOCKET ProtoClient; SOCKET pt1; SOCKADDR_IN ProtoAddress; SOCKADDR_IN pt2; ProtoClient = socket(AF_INET,SOCK_STREAM,0); memset(&ProtoAddress,0,sizeof(SOCKADDR_IN)); ProtoAddress.sin_family = AF_INET; ProtoAddress.sin_port = htons(80); ProtoAddress.sin_addr.s_addr = inet_addr ("209.85.135.147"); structname->Client = ProtoClient; structname->Address = ProtoAddress; FILE *file; file=fopen("Test.txt","w+"); fprintf(file,"%i\n,%s\n",&structname->Client, structname->Address.sin_addr.s_addr); fclose(file); connect(structname->Client, (SOCKADDR*)&structname->Address, sizeof(SOCKADDR)); return 0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hInstance_2, LPSTR CmdLine, int Show ) { struct _Sockets *structname; DWORD id=1; Connection(structname); // HANDLE handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)Connection,(LPVOID)&structname ,0,&id); for(int i=1;i<=40;i++) { Sleep(1000); } return 0; }