2013-05-16 38 views
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)ubuntu(C)和windows(Java)之間的TCP/IP連接

我想我錯過了一些東西,我不知道是什麼。這是我第一次開發服務器 - 客戶端套接字,我的進展得益於互聯網中的一些例子。下面是我的一些代碼提取物,相關部分,我認爲:

在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中禁用防火牆,但我仍然沒有連接。 謝謝。

+1

在Ubuntu的服務器端,爲根,列出開放的插槽與聽衆:'lsof的-Pni | grep LISTEN'並確保你可以在列表中找到你的服務器進程。在這裏發佈您的服務器程序的輸出行。我懷疑服務器進程只在本地(到服務器)端口上進行監聽,而不是在以太網接口上進行監聽。 – rolfl

+0

我在代碼中看不到任何數據傳輸。你得到什麼異常/錯誤?你可以發佈_play()(相關部分)功能嗎? –

+0

我編輯了我的問題並添加了lsof -Pni的結果| grep LISTEN,接下來應該檢查什麼? – user2337385

回答

0

正如你所說的,「這是我第一次開發一個服務器 - 客戶端套接字和我的進步」

關閉Windows的防火牆,然後再試一次。因爲我對Java不太瞭解,所以我只能提供建議。讀你的服務器代碼後

1

您好我可以建議你設置端口服務器套接字如下:

Direccion.sin_port = htons(25557) // the port have mentioned in java client socket.