Quelle est la raison possible de l’erreur de socket EINPROGRESS dans solaris?

Quelles sont les raisons possibles de l’erreur de socket EINPROGRESS dans Solaris? Comment pouvons-nous vérifier la cause première?

tcp api est: connect

Vous avez un socket non bloquant et vous appelez connect() . Étant donné que connect() besoin de la négociation à 3 voies (donc d’un aller-retour sur le réseau), il bloque l’attente du SYN-ACK dans les sockets bloquants ou vous indique qu’il n’a pas encore réussi dans les sockets non bloquants. Normalement, les sockets non bloquants renvoient EAGAIN / EWOULDBLOCK pour vous dire qu’ils ne peuvent pas progresser et vous devez réessayer: ce n’est pas tout à fait votre cas, connect() renvoie EAGAIN / EWOULDBLOCK lorsqu’il n’y a pas de ports éphémères libres pour vous dire que vous devriez réessayer plus tard; il y a donc une autre erreur pour la connexion non bloquante: EINPROGRESS, qui vous indique que l’opération est en cours et que vous devez vérifier son statut ultérieurement.

Pour vérifier l’état ultérieurement, le socket sera prêt pour l’écriture, vous pourrez donc utiliser select() / poll()/... pour le tester, après quoi vous devrez getsockopt(...SO_ERROR...) pour obtenir le statut succès / échec de votre opération connect ().

Vous utilisez évidemment des sockets non bloquants et vous devez utiliser select() ou poll() pour déterminer quand vous pouvez écrire (la connexion est une forme d’écriture) sur la socket. Il en va de même lorsque vous souhaitez réellement écrire des données sur le socket connecté. vous ne vous contentez pas d’écrire et de vous connecter quand vous en avez envie, vous demandez au socket de vous dire quand vous pouvez faire quelque chose et en attendant, vous faites autre chose (l’idée d’opérations de socket asynchrones).

Vérifiez votre page de manuel pour la vérité absolue sur les codes d’erreur disponibles:

 $ man connect 

[EINPROGRESS] La socket est non bloquante et la connexion ne peut pas être terminée immédiatement. Il est possible de sélectionner (2) pour terminer en sélectionnant le socket pour l’écriture.

J’ai eu cette erreur en essayant de se connecter (avec FFMPEG) à une adresse IP locale non valide (c.-à-d. Un sous-réseau incorrect), en corrigeant l’hôte en corrigeant le problème