【问题标题】:Socket Connection between PHP and C++PHP 和 C++ 之间的套接字连接
【发布时间】:2015-04-06 09:28:45
【问题描述】:

我在 PHP 页面和 C++ 代码之间创建了一个 TCP 套接字连接。这是用于此的 c++ 代码。

服务器.cpp

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;

int main(){
    int create_socket,new_socket,fd;
    int n;
    socklen_t addrlen;
    struct sockaddr_in address;
    if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
        cout<<"The socket was created\n";
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;//INADDR_ANY;inet_addr("localhost");
    address.sin_port = htons(4000);
    cout<<"\nworking";
    if (bind(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
        cout<<"Binding Socket\n";
    while(1){
        listen(create_socket,3);
        addrlen = sizeof(struct sockaddr_in);
        cout<<"*************************\n";
        new_socket = accept(create_socket,(struct sockaddr *)&address,&addrlen);
        cout<<"*************************\n";
        char dobj[1024];
        if (new_socket > 0){
            n = read(new_socket, dobj, 1023);
            string query(dobj);
            string strl(query);
            string s, d;
            istringstream iss(strl);
            iss >> s;
            iss >> d;
            const char* source = s.c_str();
            const char* dest = d.c_str();
            printf("Here is the message: %s %s\n",source,dest);
            n = write(new_socket, "I got your message", 18);
        }
    }
    close(new_socket);
    return close(create_socket);
}

PHP 代码是 index.php

<?php
    if (isset($_GET['submit'])){
        $query = $_GET['query'];
        echo $query;
        error_reporting(E_ALL);
        $service_port = 4000;
        $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, 2048)) {
            echo $out;
        }

        socket_close($socket);
    }
?>  

<html>
<head>
</head>
<body>
    <form action="index.php" method="get">
        Query: <input type="text" name="query">
        <button type="submit" name="submit">Submit!</button>
    </form>
</body>
</html>

我在终端上运行 Server.cpp 并在浏览器上运行 index.php。当我在浏览器上运行 index.php 并输入查询“123456 7890”时,服务器在终端上打印出消息 123456 7890。

但服务器无法将“我收到你的消息”的消息发送回浏览器上的 index.php。只有当我按 Ctrl + C 退出服务器时,它才会将消息发送到 index.php,然后 index.php 才会在浏览器上回显所有内容。 这里有什么问题? 我想在Server.cpp中监听socket,无限向index.php发送消息。

【问题讨论】:

  • 与您的问题无关,但您检查的是成功而不是错误。您还需要检查错误,报告它们并以某种方式处理它们,而不是仅仅忽略它们。
  • 实际上,如果我只是在 PHP 中编写套接字部分代码并通过终端运行它。它运作良好。我不知道浏览器发生了什么。
  • 成功了。我只需要在 echo $out 行之后的 PHP 代码的 while 循环中添加“break”。谢谢..:)

标签: php c++ sockets


【解决方案1】:

我看起来你没有将你的套接字配置为非阻塞(带有 O_NONBLOCK 标志的 fcntl),所以读取操作 read(new_socket, dobj, 1023); 将阻塞,直到它接收到 1023 个字节。

您可以将套接字配置为非阻塞或一次读取更少的字节。但最好的解决方案是第一个。

有关此问题的完整解决方案的更多详细信息,请查看我的回答 here

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2012-04-05
    • 2017-08-07
    • 2013-05-21
    • 2017-10-09
    • 2014-02-14
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多