PDA

View Full Version : Fehlerauswertung von "Unix-type" API's



Neptun
02-08-04, 18:32
Hallo!

Wollte ein Test-Programm erstellen für Kommunikation per 'sockets' zwischen Windows-PC und AS/400.
Und zwar in ILE COBOL. Irgendwann hatte ich es dann auch geschafft mit CRTBNDCBL ein Programm zu erstellen nachdem das richtige Bindeprogramm mit der 'socket'-API gefunden war (google sei Dank). Dann wurde folgender Befehl eingebaut:
CALL PROCEDURE 'socket' USING P1 P2 P3 RETURNING R1.
P1=1, P2=1, P3=0
(diese Werte habe ich dem 'socket' Member in QSYSINC/SYS entnommen)
Es kam '-1' zurück in Feld R1. Das bedeutet es ist ein Fehler aufgetreten.
Dazu habe ich dann gleich mehrere Fragen:
- die Definitionen der einzelnen Felder scheint es nur in C-Syntax zu geben; oder gibt es doch irgendwo Definitionen für ILE Cobol?
- wie erhalte ich nun den "vollständigen" Fehlercode, sprich einen aussagekräftigen Fehlerhinweis?
- gibt es Beispiele in ILE Cobol für die Kommunikation über 'Sockets' ?

Beste Grüße
Neptun

Fuerchau
02-08-04, 19:03
Gerade bei der Verwendung von C-Funktionen ist es wichtig die Art des Aufrufes genau anzugeben.
Man unterscheidet zwischen "call .... by reference .... by value ...", wobei alle Aufrufe auch gemischt vorkommen können.
Das Beispiel der Funktion Socket() müsste daher so aussehen:

* Definition Binär-Felder (int)
77 Address-Family pic s9(9) comp-4.
77 Type pic s9(9) comp-4.
77 Protocoll pic s9(9) comp-4.
77 Socket-Num pic s9(9) comp-4.

call procedure "socket" by value Address-family Type Protocoll returning Socket-Num

Fehler stehen dann ja in "errno", die als externe Variable deklariert werden muss:
77 errno pic s9(9) comp-4 external.

Hier könnte jedoch die Groß/Kleinschreibung ggf. ein Problem werden.

Ein Beispiel für Socket-Programmierung habe ich nicht, aber vielleicht findest du ja was bei google.

Neptun
02-08-04, 20:29
@fuerchau
Das mit 'errno ... external' wusste ich nicht, danke!!!
Mit der Übergabe von 'BY REFERENCE' oder 'BY VALUE' (manchmal auch 'BY CONTENT') habe ich mich schon bei der ODBC-Programmierung einer anderen Anwendung (ebenfalls COBOL) 'rumgeschlagen' ;)
Grundsätzlich kann man wohl sagen das reine Eingabeparameter mit 'BY VALUE' übergeben werden und Ausgabeparameter immer 'BY REFERENCE' benötigen ... (aber wem sag ich das ...)
Werde dann die entsprechende 'BY ...' Syntax mit einbauen.

Die Groß-/Kleinschreibung scheint durch den Umwandlungsparameter [OPTION(*NOMONOPRC)] gelöst werden zu können ... jedenfalls wurde dann 'socket' nicht mehr auf 'SOCKET' im Befehl 'CALL PROCEDURE' umgesetzt.


Beste Grüße
Neptun

Fuerchau
02-08-04, 22:19
Das Problem ist die Variable "errno", die natürlich Klein geschrieben wird.

"By content" sind immer Single-Datentypen (int, char, float, long, double, byte, ...)
"By reference" sind immer Pointer (Adressen) in der C-Syntax char*, long*, int*, ...

Ausgabeparameter können sowohl Single-Daten sein (sprich Felder) oder Adressen (Pointer).
Pointer sind in COBOL etwas schwieriger:
77 MyPointer usage pointer.

Linkage Section.

01 MyVar pic x(..).

* MyVar wird nun NICHT in der Procedure-Division mit "using" aufgeführt.
Die Adresse wird mit:
"set address of MyVar to mypointer" gesetzt !!! (goil nicht ?)

MyVar kann sowohl Strukturen als auch wieder Single-Data enthalten.
Beispiel ist "struct tm *localtime()", diese Funktion liefert einen Pointer auf eine Struktur.