簡體   English   中英

cpp與PHP通信

[英]Communication between Cpp and PHP

嘿,所以我一直在四處尋找,但我無法得到准確的答案,我想與 php 和 c++ 與 sockets 進行交流,我花了幾個小時試圖找到任何例子,但我找不到。

服務器:

WSADATA wsa_data;
    SOCKADDR_IN server_addr, client_addr;

    int wsa = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    if (wsa != 0)
        return;

    const auto server = socket(AF_INET, SOCK_STREAM, 0);

    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(1111);

    ::bind(server, reinterpret_cast<SOCKADDR*>(&server_addr), sizeof(server_addr));
    listen(server, 0);
    printf("listening for connections\n");

    int client_addr_size = sizeof(client_addr);
    for (;;)
    {
        SOCKET client;
        if ((client = accept(server, reinterpret_cast<SOCKADDR*>(&client_addr), &client_addr_size)) != INVALID_SOCKET)
        {
            SOCKET soc = client;
            string str = inet_ntoa(client_addr.sin_addr);

            std::cout << "connec" << std::endl;
            char dobj[1024];
           auto n = recv(soc, dobj, 1024, 0);

           std::cout << n << std::endl;
           std::cout << dobj << std::endl;
        }

        const auto last_error = WSAGetLastError();

        if (last_error > 0)
        {
            printf("error: %i\n", last_error);
        }
    }
    closesocket(server);
    WSACleanup();

客戶:

<?php
    if (isset($_GET['submit'])){
        $query = $_GET['query'];
        echo $query;
        error_reporting(E_ALL);
        $service_port = 1111;
        $address = "localhost";

        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($socket === false){
            echo "Failed: ". socket_strerror(socket_last_error($socket))."\n";
        }

        echo "Attempting to connect to '$address' on port '$service_port'...'\n";
        $result = socket_connect($socket, $address, $service_port);

        if ($result === false){
            echo "Failed: ". socket_strerror(socket_last_error($socket))."\n";
        }

        $in = $query;
        $out = '';

        echo "Sending...\n";  
        socket_send($socket, $in, strlen($in), MSG_WAITALL);
        echo "OK.\n";

        echo "Reading response:\n\n";
        while ($out = socket_read($socket, 10)) {
            echo $out;
        }

        socket_close($socket);
    }
?>  

這是我的一些嘗試,我的代碼顯示連接成功,而 php 端只是停留在發送上,我無法弄清楚

我對您的代碼做了一些微小的更改並使其正常運行。 取決於你到底想做什么,你應該能夠根據你的需要進行調整。

簡而言之:我將 PHP socket_send更改為socket_write (因為socket_send似乎“永遠”等待)並將while ($out = socket_read($socket, 10))更改為while ($out = socket_read($socket, 10) > 0)因為循環不會在第一次接收后停止。
在 C++ 中,我添加了send(soc, "got msg,", 10; 0); recv()之后將消息發送回 PHP(PHP 等待)。

在下面的代碼中,C++ 程序應該首先啟動。 它等待已建立的連接,打印它收到的一些文本並用"got msg!"回答”。 . 然后 PHP 腳本連接到套接字,發送一些字符串,等待響應並打印它。 請注意,PHP 不能永遠運行,只能運行幾秒鍾,具體取決於您的服務器。 所以你應該考慮一個設計,PHP 只是被調用來發送和接收一條消息!

C++

#include <iostream>
#include <winsock.h>

int main()
{
    WSADATA wsa_data;
    SOCKADDR_IN server_addr, client_addr;

    int wsa = WSAStartup(MAKEWORD(2, 2), &wsa_data);
    if (wsa != 0)
        return 1;

    const auto server = socket(AF_INET, SOCK_STREAM, 0);

    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(1111);

    bind(server, reinterpret_cast<SOCKADDR*>(&server_addr), sizeof(server_addr));
    listen(server, 0);
    printf("listening for connections\n");

    int client_addr_size = sizeof(client_addr);
    for (;;)
    {
        SOCKET client;
        if ((client = accept(server, reinterpret_cast<SOCKADDR*>(&client_addr), &client_addr_size)) != INVALID_SOCKET)
        {
            SOCKET soc = client;
            std::string str = inet_ntoa(client_addr.sin_addr);

            std::cout << "connected" << std::endl;
            char dobj[1024];
            auto n = recv(soc, dobj, 1024, 0);

            std::cout << n << std::endl;
            std::cout << dobj << std::endl;

            // I added the following two lines:
            send(soc, "got msg!", 10, 0);
            std::cout << "sent response" << std::endl;
        }

        const auto last_error = WSAGetLastError();

        if (last_error > 0)
        {
            printf("error: %i\n", last_error);
        }
    }
    closesocket(server);
    WSACleanup();

    return 0;
}

PHP

<?php
    if (isset($_GET['submit'])){
        $query = $_GET['query'];
        echo $query;
        error_reporting(E_ALL);
        $service_port = 1111;
        $address = "localhost";

        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($socket === false){
            echo "Failed: ". socket_strerror(socket_last_error($socket))."\n";
        }

        echo "Attempting to connect to '$address' on port '$service_port'...'\n";
        $result = socket_connect($socket, $address, $service_port);

        if ($result === false){
            echo "Failed: ". socket_strerror(socket_last_error($socket))."\n";
        }

        $in = $query;
        $out = '';

        echo "Sending...\n";  
        socket_write($socket, $in, strlen($in));
        echo "OK.\n";

        echo "Reading response:\n\n";
        while ($out = socket_read($socket, 10) > 0) {
            echo $out;
        }

        socket_close($socket);
    }
?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM