0

ubuntu 12.04 で実行されている C のサーバーと Win7 で実行されている Java (EJS) のクライアントとの間で TCP/IP 通信を確立しようとしています。サーバーはより大きなプログラムのスレッドなので、pthread で作成されます。ubuntu(localhost)のサーバーとクライアントの両方でこれを試すと、すべてうまくいき、すべての機能がうまく機能し、GUIの構成をさらに進めています。しかし、ノートブックでクライアントを win7 で使用すると、ホスト IP とポート ( /etc/hosts + /etc/services と C:\WINNT\system32\drivers\etc\ を定義しても接続できません)ホスト + C:\WINNT\system32\drivers\etc\services)

私は何かが欠けていると思います、そして私は何がわかりません。サーバークライアントソケットを開発するのは初めてで、インターネットで見つかったいくつかの例のおかげで進歩しました。これが私のコードの抜粋です。関連する部分は次のとおりです。

C のサーバー (Ubuntu):

//Initialization, headers and other threads
.
.
.

void * servidor(void *arg)
{
int Socket_Servidor;
int Socket_Cliente;
struct sockaddr_in Direccion;
struct servent *Puerto;
socklen_t Longitud_Cliente;
struct sockaddr Cliente;
struct timespec now,period;
int dummy,i,j;
unsigned long overruns_r;
int ejecutado =1;
int terminado =1;

int A[1];                    
int B[2];
double C[2];

   period.tv_sec=0;
   period.tv_nsec=PERIOD3;

   clock_gettime    ( CLOCK_REALTIME, &now);
   now.tv_nsec=now.tv_nsec+PERIOD3;
   dummy=pthread_make_periodic_np (pthread_self(), &now,&period);
   switch(dummy){
     case 0 : 
      break;
     case ESRCH: 
    printf("thread is invalid \n"); 
    pthread_exit ((void *)-1);  
      break;
     case ETIMEDOUT : 
    printf("the start time has already passed\n"); 
    pthread_exit ((void *)-1); 
      break;
     default : 
    printf(" output value not defined \n"); 
        pthread_exit ((void *)-1); 
}

Socket_Servidor = socket (AF_INET, SOCK_STREAM, 0);  //Obtener el descriptor del socket
if (Socket_Servidor == -1) printf("No se puede crear el socket\n");

Puerto = getservbyname ("cpp_java", "tcp"); //Obtener el numero del servicio 25557
if (Puerto == NULL) printf("BIND fallido\n");

Direccion.sin_family = AF_INET; //Tipo de conexion
Direccion.sin_port = Puerto->s_port; //Servicio a atender
Direccion.sin_addr.s_addr =INADDR_ANY; //Dirección del cliente (cualquiera)

if (bind (Socket_Servidor,(struct sockaddr *)&Direccion,sizeof(Direccion))==-1)
{
     printf("BIND fallido\n");
     close (Socket_Servidor);
}


if (listen (Socket_Servidor, 1) == -1) //Atender llamadas, un cliente en espera
{
     printf("Fallo en 'listen'\n");
 close (Socket_Servidor);
}

//Aceptar la conexion
Longitud_Cliente = sizeof (Cliente);
Socket_Cliente = accept (Socket_Servidor, &Cliente, &Longitud_Cliente);
if (Socket_Cliente == -1) printf ("No se puede abrir socket de cliente\n");

while(ejec){

// Some actions of the server
.
.
.

Java クライアント (win7)

// Custom section of EJS
public boolean conectar () {
try { 

    javaSocket = new Socket();//crea socket sin conexion
    ((Socket)javaSocket).connect(new InetSocketAddress("10.5.3.60",25557),3000);// 3 seg de timeout en la conexion inicial
    ((Socket)javaSocket).setSoTimeout (8000);// 8 segundos de timeout durante la conexion

    in = new DataInputStream(((Socket)javaSocket).getInputStream());
    out = new DataOutputStream(((Socket)javaSocket).getOutputStream());
    ((Socket)javaSocket).setTcpNoDelay (true);
    if (javaSocket != null) { 
        connected = true;
        _play();
    } 
}catch (java.net.UnknownHostException e) {
    lastErrorMsg = "Method startTCP: Unknown host." + " " + e.getMessage();            
}catch (SocketTimeoutException e2){
    lastErrorMsg = "Method startTCP: Timeout at connect.";            
}catch (java.io.IOException e) {
    lastErrorMsg = "Method startTCP: Input/output exception." + " " + e.getMessage();
}catch (java.lang.Exception e2){
    lastErrorMsg = "Method startTCP: No connection to host." + " " + e2.getMessage();           
}    
return connected;   
}

どんな助けでも大歓迎です。お時間をいただきありがとうございます。

コメントと回答ありがとうございます。私が試したところlsof -Pni | grep LISTEN、これが得られました:

cupsd   717  root    8u  IPv6  10478   0t0  TCP [::1]:631 (LISTEN)
cupsd   717  root    9u  IPv4  10479   0t0  TCP 127.0.0.1:631 (LISTEN)
dnsmasq 1097 nobody  5u  IPv4  11512   0t0  TCP 127.0.0.1:53 (LISTEN)
ser1    1998 root    3r  IPv4  12659   0t0  TCP *:25557 (LISTEN)

ここで、ser1 は私のサーバー プログラムです。Windowsでファイアウォールも無効にしましたが、まだ接続していません。ありがとうございました。

4

2 に答える 2

1

こんにちは、サーバーコードを読んだ後、サーバーソケットのポートを次のように設定することをお勧めします。

   Direccion.sin_port = htons(25557) // the port have mentioned in java client socket.
于 2013-05-22T07:45:56.590 に答える