Winsock Problem
-
Hallo ich habe folgenden Code um eine Winsock Anfage auszuführen und die Antwort abzufangen, bekomme aber eim compilieren immer den Fehler:
Warning W8075 clientSy.c 22: Suspicious pointer conversion in function DoRequest
Error E2342 clientSy.c 33: Type mismatch in parameter 'buf' (wanted 'signed char *', got 'answer') in function DoRequest
Warning W8066 clientSy.c 39: Unreachable code in function DoRequest
*** 1 errors in Compile ***Woran kann das liegen? (davor und danach kommt natürlich noch mehr code für die winsocks)
struct answer *DoRequest(struct request *req) { int timeout; int retlen; int recvcc; int fromlen; /* Send a message from a socket */ /**********************************************************/ /*** Erzeuge Socket mit Internet-Adressformat, ***/ /*** verbindungsloser Dienst und mit Internet-Protokoll ***/ /**********************************************************/ s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); /**********************************************/ /*** Schreibe in das Socket die Anfrage req ***/ /**********************************************/ connect(s, (struct sockaddr *)&remote, sizeof(remote)); send(s,req,sizeof(struct request),0); /* Receive a message from a socket */ while (1) { /****************************************************************/ /*** Lese die Antwort vom Socket und speichere sie in answ ab ***/ /****************************************************************/ recv(s,answ,sizeof(struct request),0); { printf ("error recvfrom"); return(0); }; break; } /* Delete a descriptor */ /************************/ /*** Schliesse Socket ***/ /************************/ closesocket(s); return(&answ); };struct request sieht so aus:
struct request { unsigned char ReqType; #define ReqNone 0 #define ReqBook 'B' #define ReqStorn 'S' unsigned FlNr; /* Flight Number */ unsigned SeNr; /* Seat Number (== 0) no Special Seat */ char name[32]; struct ExpSeat SeatWanted; /* Type of Seat wanted */ };struct answer sieht so aus
struct answer { unsigned char AnswType; #define AnswNone 0 #define AnswOk 'O' #define AnswWarn 'W' /* example: Seat not available */ #define AnswErr 0xFF unsigned FlNr; unsigned SeNo; #define ErrNo SeNo /* Are identical */ };Danke!
-
Das ist ja gar kein Funktionszeiger, Mist ich glaub ich brauch ne Brille.
-
Hallo ich habe es jetzt korrigiert aer bekomme immer noch folgende Fehlermeldung. Woran liegt das?
clientSy.c:
Warning W8066 clientSy.c 38: Unreachable code in function DoRequest
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_main' referenced from C:\BORLAND\BCC55\LIB\C0X32.OB
Jstruct answer *DoRequest(struct request *req) { int timeout; int retlen; int recvcc; int fromlen; /* Send a message from a socket */ /**********************************************************/ /*** Erzeuge Socket mit Internet-Adressformat, ***/ /*** verbindungsloser Dienst und mit Internet-Protokoll ***/ /**********************************************************/ s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); /**********************************************/ /*** Schreibe in das Socket die Anfrage req ***/ /**********************************************/ connect(s, (struct sockaddr *)&remote, sizeof(remote)); send(s,(unsigned char *)&req,sizeof(struct request),0); /* Receive a message from a socket */ while (1){ /****************************************************************/ /*** Lese die Antwort vom Socket und speichere sie in answ ab ***/ /****************************************************************/ recv(s,(unsigned char *)&answ,sizeof(struct answer),0); { printf ("error recvfrom"); return(0); }; break; } /* Delete a descriptor */ /************************/ /*** Schliesse Socket ***/ /************************/ closesocket(s); return(&answ); };
-
Hast du ein main() Programm ?
-
Das ist auch nicht so der Hit: (unsigned char *)&answ
-
Wie wäre es denn besser?
die main funktion ist in einer anderen datei (client.c)
... main(int argc, char *argv[]) { struct request req; struct answer *answPtr; long time,i; unsigned repeat=1; struct time start_usr, stop_usr; clock_t start_cpu, stop_cpu; float f_start_usr, f_stop_usr; start_cpu = stop_cpu = 0; f_start_usr=f_stop_usr = 0.0; initClient(argv[1]); for (;;) { switch (menu()) { case 'b' : case 'B' : req.ReqType = ReqBook; fillRequest(&req); break; case 's' : case 'S' : req.ReqType = ReqStorn; fillRequest(&req); break; case 'w' : case 'W' : printf("Faktor = "); scanf("%u",&repeat); continue; case 'e' : case 'E' : closeClient(); exit(0); } gettime(&start_usr); /* Start timing */ start_cpu=clock(); for (i=0;i<repeat;i++) { answPtr = DoRequest(&req); printAnswer(answPtr); } gettime(&stop_usr); /* Stop timing */ stop_cpu=clock(); f_start_usr=SEC_HOUR*start_usr.ti_hour+SEC_MIN*start_usr.ti_min+start_usr.ti_sec+((float)start_usr.ti_hund)/100.0; f_stop_usr=SEC_HOUR*stop_usr.ti_hour+SEC_MIN*stop_usr.ti_min+stop_usr.ti_sec+((float)stop_usr.ti_hund)/100.0; printf("user time (s) : %10.2f\n",(f_stop_usr-f_start_usr)); printf("sys time (s) : %10.5f\n",(stop_cpu-start_cpu)/CLK_TCK); } }; ...
-
Ich frag halt nach, weil dein Compiler scheinbar die main Funktion nicht finden kann.
-
das wundert mich auch.. ich habe zwei dateien eine client.c und eine clientsy.c und die main ist in der client.c
Beide includieren eine clientSy.h mit folgendem Inhalt
/*clientSy.h - Win32 Konsole Version */ extern void initClient(); extern struct answer *DoRequest(); extern void closeClient();und eine data.h mit folgendem Inhalt:
/* Data Declarations for Praktikum */ /* used by C and C++ ! */ /* Only Data concerning Client and Server ! */ extern char *errorTable[]; struct ExpSeat { unsigned SmokeDontCare : 1; /* If DontCare == 1 Smoker is not used */ unsigned Smoker : 1; unsigned WindowDontCare : 1; unsigned Window : 1; }; struct request { unsigned char ReqType; #define ReqNone 0 #define ReqBook 'B' #define ReqStorn 'S' unsigned FlNr; /* Flight Number */ unsigned SeNr; /* Seat Number (== 0) no Special Seat */ char name[32]; struct ExpSeat SeatWanted; /* Type of Seat wanted */ }; struct answer { unsigned char AnswType; #define AnswNone 0 #define AnswOk 'O' #define AnswWarn 'W' /* example: Seat not available */ #define AnswErr 0xFF unsigned FlNr; unsigned SeNo; #define ErrNo SeNo /* Are identical */ };Fehlt vielleicht irgedwo ein include oder Ähnliches?
-
Kenne mich mit dem Borland compiler nicht aus, aber es könnte sein, das du versuchst ein Windows Programm als Konsolenprogramm zu kompilieren.
-
Du könntest erstmal alles rausschmeissen, bis auf eine Datei.
In der sollte nur:int main() { return 0; }stehen.
Wenn das klappt, sich also ohne Fehler compilieren lässt, dann hast du schon gute Karten. Dann fügst du Stück für Stück die anderen Klammoten ein und guckst wo der Compiler meckert.
-
Hallo, ich denke ich habe den Fehler ein bisschen eingegrenzt. Ich habe vergessen zu erwähnen das ich auch noch eine Datei habe die client_conn.mak heißt.
Das ganze Projekt ist auch ein Konsolenprojekt.
Hat jemand eine idee wie ich die kompiliere?
Das kleine Testprogramm lässt sich ohne Probleme erstellen.
-
Wo hastn die her, Kumpel, Internet ?
Normalerweise gibts bei solchen Bündeln noch ne Readme Datei mit Build-Instructions.
-
Ist ne Aufgabe fürn Praktikum in der Uni. Leider keine weitere Doku außer Seite 13 und 14 von hier:
http://www.rn.inf.tu-dresden.de/lectures/komplex/Socket-Versuch/SOCKET.pdf
-
Hab keinen Account für die Uni.
-
das pdf solltest du aber trotzdem öffnen können... bei mir klappt es auch von zu Hause ohne account
-
Ja, hast Recht, das geht. Wollte die runterladen, weil sich mein Browser gern aufhängt bei PDFs und da kommt nen forbidden.
Naja, dann willst du also die Linuxversion compilieren ?
Das steht unter 4.1 Versuchsbeschreibung... make eintippen und so..guck nochmal nach.
-
nein, ich habe die windows version für boarland runtergeladen. da sind aber auch *.mak dateien dabei...
-
Tja, also ich hab den Borland Compiler nicht, ist da auch ne Version für das Visual Studio dabei, dann könnt ich probieren das zum Laufen zu kriegen.
Vielleicht hast du auch nen Komilitonen der das schon geschafft hat und dir hilft ?
-
Hallo,
erstmal danke für deine Hilfe! Wäre echt super wenn du das hinbekommen würdest!Die Version für Visual ist hier:
http://www.rn.inf.tu-dresden.de/lectures/komplex/Socket-Versuch/versuch_visual.zipWenn dir Linux /Unix lieber ist dann ist die Version hier die richtige:
http://www.rn.inf.tu-dresden.de/lectures/komplex/Socket-Versuch/versuch.tgzDanke für die Hilfe! Meine Kommilitonen haben leider auch alle nicht so die Ahnung.
-
Naja, die Visual Version lässt sich problemlos übersetzen.
Die Borland-Version wird wohl auch in ordnung sein, ich nehme an du machst etwas beim Übersetzen falsch.
Öffnest du das Projekt auch über die Projektdatei oder kompilierst du die Dateien einfach so ? Das könnte nämlich der Fehler sein.
-
Hallo, ich habe leider nur den komandozeilen compiler von borland (bcc32). Hast du da eine idee?