繁体   English   中英

GoDaddy VPS上的UDP服务器

[英]UDP Server on GoDaddy VPS

我正在尝试在GoDaddy VPS(运行CENTOS 6.8 x86_64 virtuozzo)上运行UDP服务器,并通过NodeJS从本地计算机(运行OS X的Macbook Air)与所述UDP端口通信。 当我在本地计算机上运行服务器并连接NodeJS应用程序时,一切正常。 但是,将服务器上传到VPS并使用g++ -O2 main.cpp编译后,它似乎运行良好,但是它没有收到任何消息,也没有像在我的设备上那样将任何数据回显到NodeJS发送方。本地机器。 我试图多次更改服务器上的端口。 TCP服务器在我的VPS上似乎运行良好。

这是我的服务器代码:

#define PLATFORM_WINDOWS  1
#define PLATFORM_MAC      2
#define PLATFORM_LINUX    3

#include <iostream>
using std::cout;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#if defined(_WIN32)

#define PLATFORM PLATFORM_WINDOWS

#elif defined(__APPLE__)

#define PLATFORM PLATFORM_MAC

#else

#define PLATFORM PLATFORM_LINUX

#endif

#if PLATFORM == PLATFORM_WINDOWS

#include <winsock2.h>

#elif PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_LINUX

#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <arpa/inet.h>

#endif

#if PLATFORM == PLATFORM_WINDOWS

#pragma comment(lib,"ws2_32.lib")

#endif

#define PORTNUM 15000
#define BUFMAX 1024

#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_LINUX
void macLinuxEchoLoop(int, struct sockaddr*, socklen_t);
void macLinuxEchoServer();
#endif

#if PLATFORM == PLATFORM_WINDOWS
void windowsEchoLoop(SOCKET, sockaddr*, size_t);
int windowsEchoServer();
#endif

int main(int argc, char** argv)
{
#if PLATFORM == PLATFORM_WINDOWS

    windowsEchoServer();

#else

    macLinuxEchoServer();

#endif

    puts("Press any key to continue");
    getc(stdin);

    return EXIT_SUCCESS;
}

#if PLATFORM == PLATFORM_MAC || PLATFORM == PLATFORM_LINUX

void macLinuxEchoServer()
{
    int socketFileDescriptor;
    struct sockaddr_in serverAddr;
    struct sockaddr_in clientAddr;
    int bindRet;

    socketFileDescriptor = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    bzero(&serverAddr, sizeof(serverAddr));

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    serverAddr.sin_port = htons(PORTNUM);

    bindRet = bind(socketFileDescriptor, (struct sockaddr*)& serverAddr, sizeof(serverAddr));

    cout << bindRet;

    macLinuxEchoLoop(socketFileDescriptor, (struct sockaddr*)& clientAddr, sizeof(clientAddr));
}

void macLinuxEchoLoop(int sockFd, struct sockaddr* cliaddr, socklen_t clilen)
{
    int bytesRead;
    socklen_t len;
    char msg[BUFMAX] = {0};

    printf("Waiting for datagrams on 127.0.0.1:%d\n", PORTNUM);

    for(;;)
    {
        len = clilen;
        bzero(&msg, sizeof(msg));

        bytesRead = recvfrom(sockFd, msg, BUFMAX, 0, cliaddr, &len);

        printf("Got message: %s\n", msg);

        sendto(sockFd, msg, bytesRead, 0, cliaddr, len);
    }
}

#endif

#if PLATFORM == PLATFORM_WINDOWS

int windowsEchoServer()
{
    SOCKET sock;
    sockaddr_in serverAddr;
    sockaddr_in clientAddr;
    WSADATA wsaDat;

    int wsaError = WSAStartup( MAKEWORD(2,2), &wsaDat );

    if(!wsaError)
    {
        sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

        ZeroMemory(&serverAddr, sizeof(serverAddr));

        serverAddr.sin_family = AF_INET;
        serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
        serverAddr.sin_port = htons(PORTNUM);

        bind(sock, (struct sockaddr*)& serverAddr, sizeof(serverAddr));

        windowsEchoLoop(sock, (struct sockaddr*)& clientAddr, sizeof(clientAddr));
    }
    else
    {
        return EXIT_FAILURE;
    }
}

void windowsEchoLoop(SOCKET sock, sockaddr* cliaddr, size_t clilen)
{
    int bytesRead;
    int len;
    char msg[BUFMAX] = {0};

    printf("Waiting for datagrams on 127.0.0.1:%d\n", PORTNUM);

    for(;;)
    {
        len = clilen;
        ZeroMemory(&msg, sizeof(msg));

        bytesRead = recvfrom(sock, msg, BUFMAX, 0, cliaddr, &len);

        printf("Got message: %s\n", msg);

        sendto(sock, msg, bytesRead, 0, cliaddr, len);
    }

}

#endif

这是我的NodeJS脚本,我尝试使用该脚本向UDP服务器发送消息:

var dgram = require('dgram');
var server_socket = dgram.createSocket('udp4');

server_socket.on('message', function(msg, rinfo) {
    message = new Buffer('Server Says: ' + msg.toString());
    //server_socket.send(message,0,message.length,rinfo.port,rinfo.address);
    console.log('Datagram details');
    console.dir(rinfo);
});
process.on('SIGINT',function(){
server_socket.close();
});
server_socket.on('close',function(){
console.log('Server Closed');
process.exit();
});
server_socket.bind('3001', 'localhost');
message = new Buffer('Hello fro NodeJS!');
server_socket.send(message,0,message.length,'15000','MY_VPS_IP_HERE');

MY_VPS_HERE替换为GoDaddy VPS的IP地址。

我在服务器上运行了iptables -I INPUT -p udp -j ACCEPT ,以确保它接受所有UDP数据。

netstat -l结果:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:idware-router             *:*                         LISTEN      
tcp        0      0 *:autodesk-nlm              *:*                         LISTEN      
tcp        0      0 *:imaps                     *:*                         LISTEN      
tcp        0      0 *:infowave                  *:*                         LISTEN      
tcp        0      0 *:radsec                    *:*                         LISTEN      
tcp        0      0 *:pop3s                     *:*                         LISTEN      
tcp        0      0 *:gnunet                    *:*                         LISTEN      
tcp        0      0 *:eli                       *:*                         LISTEN      
tcp        0      0 *:mysql                     *:*                         LISTEN      
tcp        0      0 *:submission                *:*                         LISTEN      
tcp        0      0 *:pop3                      *:*                         LISTEN      
tcp        0      0 *:nbx-ser                   *:*                         LISTEN      
tcp        0      0 localhost.localdomain:783   *:*                         LISTEN      
tcp        0      0 *:imap                      *:*                         LISTEN      
tcp        0      0 *:nbx-dir                   *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 *:urd                       *:*                         LISTEN      
tcp        0      0 *:ftp                       *:*                         LISTEN      
tcp        0      0 s192-169-180-198.sec:domain *:*                         LISTEN      
tcp        0      0 10.198.9.181:domain         *:*                         LISTEN      
tcp        0      0 localhost.localdomai:domain *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 *:smtp                      *:*                         LISTEN      
tcp        0      0 localhost.localdomain:rndc  *:*                         LISTEN      
tcp        0      0 *:https                     *:*                         LISTEN      
tcp        0      0 *:tsrmagt                   *:*                         LISTEN      
tcp        0      0 *:tpcsrvr                   *:*                         LISTEN      
udp        0      0 *:hydap                     *:*                                     
udp        0      0 s192-169-180-198.secu:domain *:*                                     
udp        0      0 10.198.9.181:domain         *:*                                     
udp        0      0 localhost.localdomain:domain *:*                                     
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     786547501 /var/run/dovecot/indexer-worker
unix  2      [ ACC ]     STREAM     LISTENING     786547505 /var/run/dovecot/indexer
unix  2      [ ACC ]     STREAM     LISTENING     786547507 /var/run/dovecot/login/imap
unix  2      [ ACC ]     STREAM     LISTENING     786547511 /var/run/dovecot/imap-master
unix  2      [ ACC ]     STREAM     LISTENING     786547515 /var/run/dovecot/imap-urlauth-worker
unix  2      [ ACC ]     STREAM     LISTENING     786547517 /var/run/dovecot/token-login/imap-urlauth
unix  2      [ ACC ]     STREAM     LISTENING     786547521 /var/run/dovecot/imap-urlauth
unix  2      [ ACC ]     STREAM     LISTENING     786547527 /var/run/dovecot/imap-hibernate
unix  2      [ ACC ]     STREAM     LISTENING     786547531 /var/run/dovecot/doveadm-server
unix  2      [ ACC ]     STREAM     LISTENING     786547535 /var/run/dovecot/dns-client
unix  2      [ ACC ]     STREAM     LISTENING     786547539 /var/run/dovecot/director-admin
unix  2      [ ACC ]     STREAM     LISTENING     786547543 /var/run/dovecot/dict
unix  2      [ ACC ]     STREAM     LISTENING     786547547 /var/run/dovecot/dict-async
unix  2      [ ACC ]     STREAM     LISTENING     786547551 /var/run/dovecot/config
unix  2      [ ACC ]     STREAM     LISTENING     786547553 /var/run/dovecot/login/login
unix  2      [ ACC ]     STREAM     LISTENING     786547555 /var/run/dovecot/token-login/tokenlogin
unix  2      [ ACC ]     STREAM     LISTENING     786547559 /var/run/dovecot/auth-login
unix  2      [ ACC ]     STREAM     LISTENING     786547563 /var/run/dovecot/auth-client
unix  2      [ ACC ]     STREAM     LISTENING     786547567 /var/run/dovecot/auth-userdb
unix  2      [ ACC ]     STREAM     LISTENING     786547571 /var/run/dovecot/auth-master
unix  2      [ ACC ]     STREAM     LISTENING     786547575 /var/run/dovecot/auth-worker
unix  2      [ ACC ]     STREAM     LISTENING     786547589 /var/run/dovecot/quota-status
unix  2      [ ACC ]     STREAM     LISTENING     786547592 /var/run/dovecot/master
unix  2      [ ACC ]     STREAM     LISTENING     786580200 /usr/local/cpanel/var/cpwrapd.sock
unix  2      [ ACC ]     STREAM     LISTENING     786580202 /usr/local/cpanel/var/cpauthd.sock
unix  2      [ ACC ]     STREAM     LISTENING     1414233375 @/com/ubuntu/upstart
unix  2      [ ACC ]     STREAM     LISTENING     786547581 /var/run/dovecot/anvil
unix  2      [ ACC ]     STREAM     LISTENING     3006621825 /var/lib/mysql/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     786583027 /var/run/cphulkd.sock
unix  2      [ ACC ]     STREAM     LISTENING     786580952 /var/cpanel/dnsadmin/sock
unix  2      [ ACC ]     STREAM     LISTENING     786547585 /var/run/dovecot/anvil-auth-penalty
unix  2      [ ACC ]     STREAM     LISTENING     786580204 /usr/local/cpanel/var/cpdoveauthd.sock
unix  2      [ ACC ]     STREAM     LISTENING     1414242689 /var/run/saslauthd/mux
unix  2      [ ACC ]     STREAM     LISTENING     786547462 /var/run/dovecot/stats
unix  2      [ ACC ]     STREAM     LISTENING     786547468 /var/run/dovecot/ssl-params
unix  2      [ ACC ]     STREAM     LISTENING     786547470 /var/run/dovecot/login/ssl-params
unix  2      [ ACC ]     STREAM     LISTENING     786547474 /var/run/dovecot/replicator
unix  2      [ ACC ]     STREAM     LISTENING     786547478 /var/run/dovecot/replication-notify
unix  2      [ ACC ]     STREAM     LISTENING     3006633856 /var/run/ftpd.sock
unix  2      [ ACC ]     STREAM     LISTENING     786547481 /var/run/dovecot/login/pop3
unix  2      [ ACC ]     STREAM     LISTENING     786547487 /var/run/dovecot/log-errors
unix  2      [ ACC ]     STREAM     LISTENING     786547491 /var/run/dovecot/lmtp
unix  2      [ ACC ]     STREAM     LISTENING     786547495 /var/run/dovecot/ipc
unix  2      [ ACC ]     STREAM     LISTENING     786547497 /var/run/dovecot/login/ipc-proxy

服务器或VPS都是问题。 该问题与尝试在发送消息之前将NodeJS服务器中的UDP套接字绑定到本地计算机上的特定端口有关。 我假设OS X希望选择从远程主机接收传入UDP消息的端口。 我做了一点我认为不起作用的微小更改,但是至少值得注意的是-我更改了server_socket.send(message,0,message.length,'15000','MY_VPS_IP_HERE'); server_socket.send(message,0,message.length,15000,'MY_VPS_IP_HERE'); (删除了“ 15000”附近的引号)

这是我完整修改过的NodeJS UDP客户端代码:

var dgram = require('dgram');
var server_socket = dgram.createSocket('udp4');

server_socket.on('message', function(msg, rinfo) {
    message = new Buffer('Server Says: ' + msg.toString());
    //server_socket.send(message,0,message.length,rinfo.port,rinfo.address);
    console.log('Datagram details');
    console.dir(rinfo);
});
process.on('SIGINT',function(){
server_socket.close();
});
server_socket.on('close',function(){
console.log('Server Closed');
process.exit();
});
//var bindRet = server_socket.bind('3001', 'localhost');
//var bindRet = server_socket.bind(7000);
//console.log('Bind result: ' + bindRet);
message = new Buffer('Hello from NodeJS!');
server_socket.send(message,0,message.length,15000,'MY_VPS_IP_HERE');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM