2017-01-08 17 views
0

GoDaddy VPS(CENTOS 6.8 x86_64 virtuozzoを実行)でUDPサーバーを実行しようとしていて、NodeJS経由でローカルマシン(Macbook Air OS X)からUDPポートと通信しようとしています。ローカルマシンでサーバーを実行してNodeJSアプリケーションに接続すると、すべて正常に動作します。しかし、サーバーを自分のVPSにアップロードしてg++ -O2 main.cppを使ってコンパイルすると、正常に動作しているように見えますが、メッセージは受信されず、ローカルマシンと同じようにNodeJS送信側にデータが返されません。私は、サーバー上のポートを複数回変更しようとしました。 TCPサーバは私のVPS上で正常に動作するようです。ここでGoDaddy VPSの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はのIPアドレスに置き換えられます。ここでは

#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 

は、私は私のUDPサーバーにメッセージを送信しようとしているとスクリプトが私のNodeJSです私のGoDaddy VPS。

すべてのUDPデータを受け入れていることを確認するために私のサーバーにiptables -I INPUT -p udp -j ACCEPTを実行しました。

サーバが稼動しているときにVPSのポート(http://www.yougetsignal.com/tools/open-ports/)のステータスをチェックすると、ポートが閉じていると表示されます。 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 
+0

私はあなたが 'bind'の戻り値をチェックすることから始めるべきだと思います。失敗した場合には、意味のあるメッセージを得るために 'perror'を使います。 –

+0

'bind'の戻り値は、VPSとローカルマシンの両方で0です。 – nicktendo

+0

実際に実行しているコードを投稿できますか?上記のコードでは戻り値のチェックはありません。 –

答えて

0

サーバーも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');に変更しました。

完全に変更された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'); 
関連する問題