首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的VPS上侦听一个端口,然后发送到PHP MYSQL保存

问在我的VPS上侦听一个端口,然后发送到PHP MYSQL保存
EN

Stack Overflow用户
提问于 2012-03-13 21:16:15
回答 2查看 1.2K关注 0票数 1

比如在我的VPS上监听一个端口TCP,然后发送到PHP MYSQL保存。

我知道如何将php连接到mysql,但我不能监听端口并将日志发送到php。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-15 19:59:47

下面是C中监听指定端口号的守护进程的基本示例。我把它写成一个简单的例子,作为一种可能的解决方案。所以,请记住,在生产中它不是现成的东西。当然,mysql的东西不包括在内。

我假设下面的内容应该在一些基于Linux的操作系统上完成。

编译后:

代码语言:javascript
复制
gcc portd.c -o portd

它可以简单地运行为

代码语言:javascript
复制
./portd

然后,您可以使用telnet进行测试:

代码语言:javascript
复制
telnet localhost 8000

键入一个简单的字符串,例如"test“并按enter,然后检查/tmp/portd.log中的守护程序日志文件

下面是一个代码(portd.c):

代码语言:javascript
复制
/**
 * Simple daemon bind to a specified port example
 *
 * @author Mykhailo Stadnyk <mikhus@smart-ip.net>
 * @version 1.0
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>

#define DEFAULT_RUNNING_DIR "/tmp"
#define DEFAULT_PID_FILE    "/tmp/portd.pid"
#define DEFAULT_LOG_FILE    "/tmp/portd.log"
#define DEFAULI_LISTEN_PORT 8000

/**
 * Logging daemon activity
 */
void log_message( char *filename, const char *message) {
    FILE *logfile;

    logfile = fopen( filename, "a");
    if (!logfile) {
        return;
    }

    fprintf( logfile,"%s\n", message);
    fclose( logfile);
}


/**
 * Signals handler (kill -HUP `cat /tmp/portdaemon.pid`, kill `cat /tmp/portdaemon.pid`)
 */
void signal_handler( int sig) {
    switch( sig){
        case SIGHUP: {
            log_message( DEFAULT_LOG_FILE, "portd: hangup signal catched, restarting...\n");
            break;
        }
        case SIGTERM: {
            log_message( DEFAULT_LOG_FILE, "portd: terminate signal catched, terminating...\n");
            exit( 0);
            break;
        }
    }
}

/**
 * Daemonizing the application
 */
void daemonize( char *pidfile) {
    int i, lfp;
    char str[10];

    if (pidfile)

    if(getpid() == 1) {
        return; /* already a daemon */
    }

    i = fork();
    if (i < 0) {
        exit( 1); /* fork error */
    }
    if (i > 0) {
        printf( "Portd daemon started, PID: %d\n", i);
        exit( 0); /* parent exits */
    }

    /* child (daemon) continues */
    setsid(); /* obtain a new process group */

    for (i = getdtablesize(); i >= 0; --i) {
        close( i); /* close all descriptors */
    }

    i = open( "/dev/null", O_RDWR); dup( i); dup( i); /* handle standart I/O */

    umask(027); /* set newly created file permissions */

    chdir( DEFAULT_RUNNING_DIR); /* change running directory */
    lfp = open( pidfile, O_RDWR|O_CREAT, 0640);

    if (lfp < 0) {
        exit( 1); /* can not open */
    }

    if (lockf( lfp, F_TLOCK,0) < 0) {
        exit( 0); /* can not lock */
    }

    /* first instance continues */
    sprintf( str,"%d\n",getpid());

    write( lfp, str, strlen( str)); /* record pid to lockfile */

    signal( SIGCHLD, SIG_IGN); /* ignore child */
    signal( SIGTSTP, SIG_IGN); /* ignore tty signals */
    signal( SIGTTOU, SIG_IGN);
    signal( SIGTTIN, SIG_IGN);
    signal( SIGHUP,  signal_handler); /* catch hangup signal */
    signal( SIGTERM, signal_handler); /* catch kill signal */
}

void error( const char *msg) {
    log_message( DEFAULT_LOG_FILE, msg);
    perror( msg);
    exit( 1);
}

int listen_socket( int portno) {
     int sockfd;
     struct sockaddr_in serv_addr;

     sockfd = socket(AF_INET, SOCK_STREAM, 0);

     if (sockfd < 0) {
        error("ERROR opening socket");
     }

     bzero((char *) &serv_addr, sizeof( serv_addr));

     serv_addr.sin_family      = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port        = htons( portno);

     if (bind( sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
         error("ERROR on binding");
     }

     listen( sockfd,5);

     return sockfd;
}

// main programm code
int main( int argc, char **argv) {
    // starting daemon
    daemonize( (char*) DEFAULT_PID_FILE);

    // bind to port (listen the specific port on all network interfaces)
    int sock_listen = listen_socket( DEFAULI_LISTEN_PORT);

    while (1) {
        // create read/write socket for client
        int sock_client;
        socklen_t clilen;
        struct sockaddr_in cli_addr;

        clilen = sizeof( cli_addr);
        sock_client = accept( sock_listen, (struct sockaddr *) &cli_addr, &clilen);

        if (sock_client < 0) {
            // nobody connected?
            sleep( 1);
            continue;
        }

        // read buffer
        char buffer[256];
        bzero( buffer, 256);

        // read the data from socket to buffer
        if (read( sock_client, buffer, 255) < 0) {
            // client was connected but we failed to read the message from him
            log_message( DEFAULT_LOG_FILE, "Can not read data from client!");
            close( sock_client);
            continue;
        }

        // Voila! client connected - data recieved and saved to buffer variable
        // now we can do something with data from client
        // here we just put data in a logfile and close the connection
        log_message( DEFAULT_LOG_FILE, (char *) buffer);
        close( sock_client);
    }

    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2012-03-13 21:51:46

正如afuzzyllama所说,PHP不是做这件事的最佳工具。但是,如果除了使用PHP之外别无选择,那么您需要编写一个守护进程,并使用套接字绑定一个守护进程来监听适当的TCP端口。Google将为您提供大量有关如何用PHP编写守护进程的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9684692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档