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
私はあなたが 'bind'の戻り値をチェックすることから始めるべきだと思います。失敗した場合には、意味のあるメッセージを得るために 'perror'を使います。 –
'bind'の戻り値は、VPSとローカルマシンの両方で0です。 – nicktendo
実際に実行しているコードを投稿できますか?上記のコードでは戻り値のチェックはありません。 –