Domanda

Da questo rpg presa esercitazione abbiamo creato un client socket in gioco di ruolo che chiama un socket server Java

Il problema è che connect () / send () operazioni di blocchi e abbiamo un requisito che, se il / invio di connessione non poteva essere fatto nel giro di un secondo per dire, dobbiamo registrare solo esso e finitura.

Se ho impostato la presa per non-blocking mode (credo con fnctl), non siamo pienamente capire come procedere, e non possiamo trovare alcuna documentazione utile con esempi per esso.

Credo che se faccio di connessione ad una presa non-blocking che devo fare selezionare (..., timeout) che ci dice se il collegamento riescono e / siamo in grado di inviare (byte). Ma, se mandiamo (byte) in seguito, come è ora una presa non bloccante (che immediatamente tornare dopo la chiamata), come faccio a sapere che send () ha fatto l'invio effettivo dei byte al server prima di chiudere la presa?

I può ripiegare per avere la socket client in AS400 come una procedura Java o C, ma ho davvero voglia di tenere solo in un semplice programma RPG.

avrebbe aiutato qualcuno mi capire come fare per favore? Grazie!

È stato utile?

Soluzione

A mio parere, che esercitazione RPG si parla ha un lieve difetto. Quello che credo sta causando la vostra confusione è il codice il seguente della sezione:

  

...
  Di conseguenza, di solito chiamiamo   send () API in questo modo:

D miscdata        S             25A
D rc              S             10I 0

C                   eval      miscdata = 'The data to send goes here'
C                   eval      rc = send(s: %addr(miscdata): 25: 0)
c                   if        rc < 25
C*  for some reason we weren't able to send all 25 bytes!
C                   endif
     

...

Se si legge la documentazione di send() si vedrà che il valore di ritorno non indica un errore se è maggiore di -1 ancora nel codice qui sopra sembra come se si è verificato un errore. Infatti, la somma dei valori di ritorno deve essere uguale alla dimensione del buffer supponendo che si mantiene in movimento del puntatore nel buffer per riflettere ciò è stata inviata. Guardate qui in di Beej Guida alla rete di programmazione . Ti potrebbe piacere anche a guardare il libro di Richard Stevens' UNIX Network Programming, Volume 1 spiegazioni molto dettagliate.

Per quanto riguarda il problema di determinare se l'ultimo di invio prima di close() ha fatto l'invio effettivo ... bene il paragrafo di cui sopra spiega come determinare quale parte dei dati è stato inviato. Tuttavia, chiamando close() tenterà di inviare tutti i dati non inviati a meno che SO_LINGER è impostato.

fnctl() è utilizzato per controllare il blocco mentre setsockopt() viene utilizzato per SO_LINGER set.

L'astrazione delle comunicazioni di rete in uso è socket BSD. Ci sono alcune leggere differenze nel implementazioni in tutto il sistema operativo di ma è generalmente abbastanza omogenea. Questo significa che si può generalmente usare documentazione scritta per altri OS per la panoramica ampia. La maggior parte del tempo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top