1

PHP でソケットを使用して、特定の IP とポートへの単純な TCP/IP 接続を確立しようとしています。

「ノンブロッキング ソケット操作をすぐに完了できませんでした」というエラー メッセージが表示されます。以下は私のコードです:

<?php
$address = 'myhost.com';
$service_port = 1234;
$timeout = 1000;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
$error = NULL;
$attempts = 0;
while (!($connected = @socket_connect($socket, $address, $service_port)) && ($attempts < $timeout)) {
    $error = socket_last_error();
    if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
          echo socket_strerror($error) . "\n";
          socket_close($socket);
          return NULL;
    }
    usleep(1000);
    $attempts++;
}
?>

何か案は?ターゲット ホストの IP またはポートに問題がないことはわかっています。

4

2 に答える 2

2

サーバーに通常使用される非ブロッキングソケット。サーバーは接続を待機しているため、を使用する代わりに、代わりに使用してみsocket_connectてくださいsocket_listen

サーバーへの接続を確立する(クライアントになる)場合は、ヨハネスの提案を使用してください

于 2013-07-01T20:49:36.503 に答える
2

connect()ノンブロッキング ソケットで呼び出しています。呼び出しは、その操作を完了するために常にブロックする必要があります。またconnect()、ソケットをブロックしないように明示的に指示したため、操作が (まだ) 完了していないことを示すエラーがすぐに返されます。

ソケットを直接使用する場合、使用している OS に左右されます。コードは全体的に見栄えがします。になるまで接続を再試行しますEINPROGRESS。それは本当にあなたが見ているエラーコードですか?間違ったエラーコードをチェックしている可能性がありますか?

とにかく、あなたのコードは、接続が確立されるまで接続しようとしているように見えます。ブロッキングモードを直接使用して、それを実現できます。

ソケットを接続するまでソケットをブロッキングのままにし、接続後にソケットを非ブロッキングに設定します(本当に必要であると仮定します)。

于 2013-07-01T20:45:24.470 に答える