PDA

View Full Version : Socket Fehler 3430 bei Connect



Hubert
26-08-19, 12:27
Guten Tag,

beim Versuch eine Socket Verbindung aufzubauen bekomme ich immer den Fehlercode 3430 ( Operation in progress) zurück. Ein Auszug aus dem Code ist hier:


D p_sockaddr S *

D sockaddr DS based(p_sockaddr)
D sa_family 5I 0
D sa_data 14A

D sockaddr_in DS based(p_sockaddr)
D sin_family 5I 0
D sin_port 5U 0
D sin_addr 10U 0
D sin_zero 8A

...

flags = fcntl(sock: F_GETFL);
flags = %bitor(flags: O_NONBLOCK);
fcntl(sock: F_SETFL: flags);

...

addrlen = %size(sockaddr);
p_connto = %alloc(addrlen);
p_sockaddr = p_connto;

sin_family = AF_INET;
sin_addr = IP;
sin_port = Port;
sin_zero = *ALLx'00';
RetCode = connect(sock: p_sockaddr : addrlen);
if RetCode < 0;
errnoPtr = getErrnoPtr();
dsply ('Open = ' + %char(errno));
Retcode = sclose(sock);
if RetCode < 0;
errnoPtr = getErrnoPtr();
dsply ('Open = ' + %char(errno));
endif;
return;
endif;

Wenn ich das "NONBLOCK" nicht setze, bleibt das Programm beim Connect stehen, bis ich es abbreche.

Hat jemand eine Idee, woran das liegt?

Vielen Dank im Voraus

Hubert

P.S. Ich habe die Vorlage aus der Anleitung von Scott Klement

Fuerchau
26-08-19, 12:32
3430 ist kein Fehler:

<dl class="dl ibm-padding-top-1"><dt class="dt dlterm">EINPROGRESS</dt><dd class="dd margin-left-2">3430 - Operation in progress


Dein Fehler, dass keine Verbindung zustande kommt, muss also ein anderer sein.
</dd></dl>

prsbrc
26-08-19, 12:58
Schönen Nachmittag.

Ich bin auch gerade dabei für mich ein Socketprogramm zu basteln welches über IMAP Mails ausliest. Dazu verwende ich das SOCKET_H-File von Scott Klement und nicht das komplette Socket-API.

https://github.com/PantalonOrange/Mailviewer/blob/master/QRPGLESRC/IMAPVWRG.rpgle

Prozedur
connectToHost

Schau mal rein und kopier dir die benötigten Stellen raus.
Funktioniert bei mir wunderbar... :-)

greets

Hubert
27-08-19, 14:24
Das Problem besteht darin, dass mit den Zeilen


flags = fcntl(sock: F_GETFL);
flags = %bitor(flags: O_NONBLOCK);
fcntl(sock: F_SETFL: flags);


der Socket nicht geblockt wird. Wenn ich diese Zeilen weglasse und die Waage aus irgendeinem Grund nicht antwortet, bleibt das Programm ohne Fehlermeldung stehen.
Der Versuch mit

d TimeOut DS
d Sekunden 10i 0 inz(5)
d usec 10i 0 inz(0)

RetCode = setsockopt(sock
:SOL_SOCKET
:SO_RCVTIMEO
:%addr(Timeout)
: %size(Timeout)
);

ein Timeout zu setzen, bringt leider auch keinen Erfolg. Habe ich vielleicht beim Setzen des Timeout einen Gedankenfehler?

prsbrc
29-08-19, 09:12
Hallo.

Ich habe jetzt etwas geforscht und scheinbar wird der Timeout mit dem setSockOpt API nicht unterstützt. Dazu muss man das Unix98 API qso_setsockopt98 verwenden.
http://blog.rpgnextgen.com/blog/2017/08/24/hey-socket-take-a-break

Greets

Hubert
02-09-19, 14:54
Das hatte ich auch gefunden. In der Prozedurdefinition hatte ich das bereits angegeben.


D setsockopt PR 10I 0 ExtProc('qso_setsockopt98')
D socket_desc 10I 0 Value
D level 10I 0 Value
D option_name 10I 0 Value
D option_value * Value
D option_length 10I 0 Value

Das hat leider auch Nichts gebracht.

prsbrc
03-09-19, 07:33
Guten Morgen.
Dann weiß ich leider auch nicht mehr weiter. Versuchs mal im englischsprachigen Forum https://www.code400.com/forum/ denn dort ist Scott Klement auch aktiv unterwegs. Vielleicht kann dir dort besser geholfen werden.

greets