Socket JAVA + C

14 respostas
F

Pessoal preciso terminar um trabalho de Redes de Computadores para amanhã, mas estou tendo problemas com a conexão do Sockets… No meu programa, eu tenho um cliente/servidor com sockets em Java, no meio desta comunicação eu preciso enfiar um cliente/servidor em C que funcione de pombo correio entre os sockets Java… Alguém poderia me dizer como posso fazer para o server socket em C entender a mensagem que o cliente socket em Java está a enviar?

Não estou conseguindo…

É para amanhã o projeto… Não imaginei que teria dificuldades nesta parte…

Obs: devido as circunstâncias considero a possibilidade de recompensa pela solução…

14 Respostas

pablosaraiva

Bom. Imagino que você esteja falando de um Socket TCP.

Nesse caso, a mensagem que você transmitir do socket no java será recebida pelo socket do programa C exatamente da mesma forma.

Basta então seu programa em C encaminhar para os destinatários, que também receberam a mensagem da mesma forma.

Dê uma lida nesse guia sobre sockets no java.
http://java.sun.com/docs/books/tutorial/networking/sockets/

Se tiver alguma dúvida mais específica, favor postar nova mensagem.

F

Então, eu pensei que funcionaria perfeitamente também…

Mas tem algumas diferenças na forma em que o Java e o C tratam uma mensagem… No Java é uma String, no C é um vetor de Chars, etc…

Eu preciso sabe como em que estrutura devo enviar a mensagem para que o socket no C consiga ler corretamente…

pablosaraiva

Se você enviar uma String no java. O C vai receber um vetor de caracteres com o mesmo conteúdo.

ViniGodoy

Como as duas pontas são java, você não vai ter problema nenhum.

Simplesmente envie todos os bytes que receber do servidor de um host ao outro. Você não precisa nem decodifica-los do lado do C. É só receber e repassar.
Pode até mesmo carregar tudo num byte[].

F

pablosaraiva:
Se você enviar uma String no java. O C vai receber um vetor de caracteres com o mesmo conteúdo.

Por favor você poderia fazer a gentileza de me disponibilizar um código em ambas linguagens para o que eu estou querendo então? Porque não estou conseguindo fazer, e preciso com muita urgência, seria de muita boa vontade da sua parte se fizesse isso…

Obrigado cara…

F

ViniGodoy:
Como as duas pontas são java, você não vai ter problema nenhum.

Simplesmente envie todos os bytes que receber do servidor de um host ao outro. Você não precisa nem decodifica-los do lado do C. É só receber e repassar.
Pode até mesmo carregar tudo num byte[].

cara vc poderia fazer a gentileza de me escrever um código em C que faça isso? Eu seria eternamente grato, sinceramente, pois estou com a corda no pescoço…

Posso até te recompensar se der certo…

Eu não manjo C e to ferrado… abracos

pablosaraiva

Você está usando Windows? (Estou perguntando pq a biblioteca C para sockets é dependente do SO).

ViniGodoy

Teu professor passou esse trabalho hoje?

F

linux

F

não, ele passou faz um tempinho, porém o grosso do trabalho eu já fiz, o que sobrou foi a conexão destes sockets, o que eu pensei que não seria problemático…

tem como me ajudar com o código?

o código em C q eu esto uusando é este;

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>

#define PORT            31111
#define MAXBUF         1000

#define PORTC           41111
#define SERVER_ADDR     "127.0.0.1"

int main(int argc, char **argv){
    int s, client_s, len, port;
    struct sockaddr_in self;
    struct sockaddr_in client;
    int addrlen = sizeof(client);


    char msg_write[MAXBUF];
    char msg_read[MAXBUF];


    port = PORT;
    if (argc == 2) {
        port = atoi(argv[1]);
    }


/*---Open socket for streaming---*/

    if ( (s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
        perror("Socket");
        exit(errno);
    }

/*---Initialize server address/port struct---*/

    bzero(&self, sizeof(self));
    self.sin_family = AF_INET;
    self.sin_port = htons(port);
    self.sin_addr.s_addr = INADDR_ANY;


/*---Assign a port number to the socket---*/

    if ( bind(s, (struct sockaddr*)&self, sizeof(self)) != 0 ) {
        perror("socket--bind");
        exit(errno);
    }


/*---Make it a "listening socket"---*/

    if ( listen(s, 1) != 0 ) {
        perror("socket--listen");
        exit(errno);
    }



/*---accept a connection ---*/

    printf ("Server C accpeting connections!\n");
    client_s = accept(s, (struct sockaddr*)&client, &addrlen);
    printf ("%s:%d connected\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));



    read (client_s, msg_read, MAXBUF);
    len = strlen(msg_read) - 1;
    if (msg_read[len] == '\n'){
        msg_read[len] = '\0';
    }

    printf ("Mensagem do cliente: %d\n", msg_read);





//envia mensagem recebida ao servidor em java

    int sC, n, buflen, server_port;
    struct sockaddr_in dest;
    msg_write[MAXBUF];
    char server_addr[50];


    server_port = PORTC;
    strcpy (server_addr, SERVER_ADDR);


/*---Open socket for streaming---*/

    if ( (sC = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
        perror("Socket");
        exit(errno);
    }


/*---Initialize server address/port struct---*/

    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(server_port);

    if ( inet_aton(server_addr, &dest.sin_addr.s_addr) == 0 ) {
        perror(server_addr);
        exit(errno);
    }

/*---Connect to server---*/

    if ( connect(sC, (struct sockaddr*)&dest, sizeof(dest)) != 0 ) {
        perror("Connect ");
        exit(errno);
    }


    write (s, msg_read, strlen(msg_read)+1);



    close(s);
    close(sC);
}
ViniGodoy

http://www.frostbytes.com/~jimf/papers/sockets/sockets.html

ViniGodoy

Hummmm… então você já fez parte do trabalho. Muito bom.

O que não funciona nesse seu código? O cliente não conecta? O que acontece?

Ah, quando for postar código, por favor, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

F

ViniGodoy:
Hummmm… então você já fez parte do trabalho. Muito bom.

O que não funciona nesse seu código? O cliente não conecta? O que acontece?

Ah, quando for postar código, por favor, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

Obrigado pela dica…

Os erros são…

No socket em C na verdade não aparece erros, apenas não imprime a mensagem como deveria…

No socket em Java aparece o seguinte…

Exception in thread main java.io.EOFException

at java.io.DataInputStream.readUTF(DataInputStream.java: 375)

at collector.Main.main(Main.java: 62)

Eu já tentei fazer o read do Java com readChar, readChars, readUTF, mas todos dão esse erro…

Se eu não uso o código em C, o outro lado do socket em Java consegue receber a mensagem normalmente…

leandromarrom

Pow to com o mesmo problema, não estou conseguindo ler com o readUTF() e nem da erro nenhum…
um exemplo do codigo:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Servidor {
    
	public static void main(String args[]){
		try {

			final ServerSocket servSocket = new ServerSocket(5012);
	    	
	        Socket cliente = servSocket.accept();
	        
    	    DataOutputStream out = new DataOutputStream(cliente.getOutputStream());
    	    DataInputStream in = new DataInputStream(cliente.getInputStream());     	    
	        
    	    out.writeUTF("Seja bem vindo ao socket! \n\r");
    	    
    	    String s = in.readUTF();
    	    System.out.println("chegou aque "+s);	
	        
	    	
	    } catch (final IOException ex) {
	        ex.printStackTrace();
	    }
		
	}

}
Criado 10 de setembro de 2009
Ultima resposta 28 de set. de 2009
Respostas 14
Participantes 4