Forum: PC-Programmierung dll erstellen in c


von gast (Gast)


Lesenswert?

Hallo, will eine DLL in C erstellen die mir für ne Geäteverbindung über 
UDP bestimmte Funktionen bereitstellt, daten verfügbar, daten senden 
usw.
Die einzelnen Funktionen will ich dann in Matlab aufrufen können.
Für C gibts ja fertige API's  wie winsocket  für UDP verbindung

im Prinzip wollt ich gleich die einzelnen Funktion z.B socket 
öffnen,daten verfügbar usw. in jeweils eine extra Funktion von meiner 
DLL packen  und auf diese von Matlab zugreifen. Meine Frage nun- geht 
das überhaupt und falls ja hat eventuell noch jemand einen Link wie dlls 
unter c erstellt werden bzw. kennt jemand ein gute buch, wenn möglich 
auf deutsch


danke

von zwieblum (Gast)


Lesenswert?

__declspec(dllexport) IchbineineFunktion();

viel spaß mit der winsock library. du kannst dir das leben aber auch 
leichter machen und cygwin installieren, da bekommst zumindest den hauch 
von benutzbarkeit rein.

von Klaus W. (mfgkw)


Lesenswert?

Wenn ich das richtig rekonstruiere, muß in der DLL dann eine
Funktion mexFunction() stehen:
1
void mexFunction( int nlhs,
2
                  mxArray *plhs[],
3
                  int nrhs,
4
                  const mxArray *prhs[]
5
                  )
6
{
7
  ...
8
}
Das ist dann die Funktion, die später von Matlab aufgerufen wird.

Kompilieren kann man das Ganze direkt von Matlab aus (wenn
alles passend eingerichtet ist: mex irgendwas.c)

(mit allem Vorbehalt, das ist schon lange her).

von häfftling (Gast)


Lesenswert?

zur dll
ich weis nicht ob des so auch unter c geht aber es ist gut erklärt:
http://www.tutorials.de/forum/c-c-tutorials/312435-dll-erstellen-und-eigene-programme-einsetzen.html

zu winsock
das winsock zeugs hab ich mir da gelernt:
http://robsite.net/posts/netzwerkprogrammierung-mit-sockets-in-c-pdf
ist eine schöne anleitung die man auch verstehen kann.

bei winsock bin ich der meinung von zwieblum, winsock ist nicht so 
schön.

von gast (Gast)


Lesenswert?

hab auch ne anleitung gefunden, aber das ist etwas undurchsichtig, gibts 
auch eine funktion "daten verfügbar" so ähnlich wie in jave da konnte 
man das schön empfangen mit wenn daten verfügbar dann lese daten, brauch 
unbedingt daten verfügbar da die daten kontinuirlich empfangen werden

von Klaus W. (mfgkw)


Lesenswert?

select()

von Gast (Gast)


Lesenswert?

Eine letzte Frage hab ich noch,

in meiner dll hab ich geschrieben nach anleitung

int startWinsock(void)
{

WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa);

}


jetzt kommt der Fehler [LINKER ERROR] undefined reference to 
WSAStartuo@8


hab aber winsock2 inkludiert, weiss einer wiese der die Funktion nicht 
kennt und ich das nicht kompilieren kann

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist eine Fehlermeldung des Linkers.

Die bedeutet, daß Du vergessen hast, die Library zu linken, in der 
WSAStartup implementiert ist.

Übrigens: Code und Fehlermeldungen nie abtippen, sondern per Copy&Paste 
einfügen, sonst können sich -- wie bei Dir -- Tippfehler einschleichen.

  WSAStartup

  WSAStartuo

von gast (Gast)


Lesenswert?

trotzdem komisch, die ist doch eigentlich in der winsock2.h enthalten, 
hätte ich zumindest gedacht, das andere kennt er ja auch wie Socket s, 
und wo kann ich die dazulinken, vei den compilereinstellungen, oder 
macht man das direkt im Quellcode

von Klaus W. (mfgkw)


Lesenswert?

nochmal: WSAStartuo mit >>>>o<<<< hintendran ist der falsche Name!
Falls es noch immer nicht geht, bitte mit vollständiger Fehlermeldung
(nicht irgendwie abgetippt, sondern exakt kopiert).

von gast (Gast)


Lesenswert?

hab es jetzt hinbekommen, musste noch 2 lib dateien dazu linken

aber nun noch eine frage dieser select befehl gibts in meinem tutorial 
nicht, was muss denn dem übergeben werden und was gibt der zurück

von gast (Gast)


Lesenswert?

ach und mexfiles bring mir hier nichts, die funktionieren wie ne normale 
funktion, man kann in matlab einfach so ne dll von c/c++ einbinden ist 
bedeutend leichter als die verwendung von mexfiles da man die werte nich 
umformatieren muss

von Karl H. (kbuchegg)


Lesenswert?

gast schrieb:
> hab es jetzt hinbekommen, musste noch 2 lib dateien dazu linken
>
> aber nun noch eine frage dieser select befehl gibts in meinem tutorial
> nicht,

Dann such dir ein anderes Tutorial
oder benutz googel

von gast (Gast)


Lesenswert?

ich bekomm es einfach nicht hin, hab ein neues tutorial und da ist 
beschrieben wie man select befehl für einen server verwendet wenn man 
mehrere clients hat,

auch schreibe ich ein programm für einen client, also daten senden zum 
gerät und warten was zurückkommt, der recv befehl blockiert ja solange 
bis der daten bekommt, was sehr schlecht ist.  also will ich recv nur 
aufrufen wenn daten verfügbar sind aber wie soll das mit select 
funktionieren
kennt einer vielleicht doch noch ein toturial wo dieser fall mal 
beschrieben ist. überall erfahre ich bloß, dass man mit select befehl 
prüfen kann ob daten am port verfügbar sind aber wie genau wird nie 
erwähnt

von Tuffke (Gast)


Lesenswert?

Das ist eigentlich ganz nett gemacht:

http://www.c-worker.ch/tuts/select.php#problem

von Klaus W. (mfgkw)


Lesenswert?

Das select() im Server ist übrigens das gleiche wie im Client...

Wenn man dann im client nur Daten von einem Server erwartet,
setzt man halt nur den fd dieser Verbindung in readfds ein.

Als Alternative könnte man den Socket auch auf "non blocking" setzen
und ohne select() einfach lesen.
Wenn keine Daten anliegen, bekommt man einfach 0 gelesene Bytes zurück
und probiert es später wieder.

Eine dritte Möglichkeit ist, sein Programm auf einen Hauptthread und
einen weiteren Thread pro Socketverbindung aufzuteilen.
Bei dem Client wären das der Hauptthread und einer für die
Verbindung zum Server.
Der Thread mit der Socketverbindung liest einfach und blockiert,
solange nichts kommt, während der Hauptthread normal weiterläuft.

von Gast (Gast)


Lesenswert?

Ich hab jetzt folgenden Code geschrieben, könnte das gehen oder ist das 
falsch, timeout würde ich noch setzten, hab leider noch kein Gerät zum 
testen, Fehler hab ich keine

}



DLLIMPORT int data_available(void)
{

FD_SET fdread;


rc = select(0,&fdread,NULL,NULL,NULL);


if(rc=FD_ISSET(s,&fdread))
return 0; //DAten liegen an



else
return 1;
}



DLLIMPORT int socket_close(void)


und in Matlab ruf ich dann auf:



x=calllib('Matlab_UDP', 'data_available')

if (0==x)
data=calllib('Matlab_UDP', 'read_data',234)
end

von Rolf Magnus (Gast)


Lesenswert?

Nein, das wird so nicht klappen. Davon abgesehen, daß die Benutzung von 
select komplett falsch ist, hast du das  Blockieren hier auch nur von 
recv nach select verlagert. Das einfachste wäre, wie Klaus schreibt, den 
Socket auf nonblocking umzuschalten.

von Gast (Gast)


Lesenswert?

gut dann versuch ich das, gibts da auch wieder ein toturial wie man 
einen Socket auf nonblocking umschaltet, weil ich hab ma wieder keine 
Ahnung wie das gehen soll

von Mark B. (markbrandis)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Im MSDN sind die Winsockets ziemlich umfassend beschrieben.
Generell ist Netzwerkprogrammierung erstklassig beschrieben in:
  W. Richard Stevens
  UNIX Network Programming
  Volume 1: Networking APIs: Sockets and XTI
Dauert aber etwas mehr als 5 min...
select() ist dort übrigens auch gut beschrieben.

Nebenbei: Dein Kram wäre nicht so nervig zu lesen, wenn du mal Sätze 
formulieren würdest inklusive Satzzeichen und Groß-/Kleinschreibung.
Wenigstens soviel Mühe kann man sich schon geben, wenn man andere
Leute mit der eigenen Arbeit beschäftigt.

von Eric (Gast)


Lesenswert?

Hallo,

Es funktioniert jetzt fast alles. Ich habe nur ein Problem. in meiner 
DLL Funktion read_Data gebe ich ein char* zurück. Unsigned char versteht 
Matlab nicht. Von Matlab wird das automatisch als cstring interpretiert. 
Jetzt hab ich das Problem, das es O Bytes gibt -> \0 terminiert mein 
String. Wie kann ich MatLab nun sagen das es mir die bytes als Binar, 
Hex Werte oder sonst was  ausgibt. Im nachhinein weis ich wie das geht, 
aber da wurde der String schon terminiert und ich komm an den Hexwert 
nicht mehr ran, weil die restlichen Daten in Matlab verloren gegangen 
sind.  Matlab soll also  das Byte als hex und nicht als String 
interpretieren

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.