[英]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.