2008. 7. 24. 19:51

C_JAVA_SOCKET_구조체 통신

//--------------------------------------------------
Server

#include <string.h>
#include <stdio.h>

#include <sys/socket.h>
#include <sys/types.h>

#include <netinet/in.h> 
#include <arpa/inet.h>
#include <errno.h>


#define PORT              6331
#define BUFSIZE           1024

#define DFT_MAGIC_SIZE    5
 
unsigned char buf[BUFSIZE];

int readline(int , void *, int );
  typedef struct{
    char magic[DFT_MAGIC_SIZE];
    int type;
    int len;
  }PHeader;

int main() {
  int server_sd,client_sd;
  int nbyte=0;
  unsigned long client_len;
  int i,j;

  i=0;
  struct sockaddr_in server_addr,client_addr;

  bzero(&server_addr,sizeof(server_addr));
  bzero(&client_addr,sizeof(client_addr));

  bzero(buf,BUFSIZE);
  memset((unsigned char*)&buf,0x00,BUFSIZE );

  /* socket create */
  if ( (server_sd=socket(AF_INET,SOCK_STREAM,0)) < 0 ) {
    perror("Socket create error : ");
    return -1;
  }

  server_addr.sin_family=AF_INET;
  server_addr.sin_port=htons(PORT);
  server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

  fprintf(stderr,"using PORT / [%d]\n",PORT);

  if( bind(server_sd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0) {
    perror("socket bind error ");
    close(server_sd);
    return -1;
  }

  listen(server_sd,1);
  client_len=sizeof(client_addr);

  fprintf(stderr,"Waiting...\n");

  if( (client_sd=accept(server_sd,(struct sockaddr *)&client_addr, &client_len)) < 0) {
    perror("Accept Error ");
    return -1;
  }
  else{
    printf("client connect...\n");
  }

  fprintf(stderr,"client_sd : %d\n",client_sd);
 
  PHeader * header;

  //while(1) {
    nbyte=read(client_sd, buf, BUFSIZE);
    header = (PHeader *)buf;
   
    fprintf(stderr,"[%d] read size : %d\n",i++,nbyte);   
    printf("magic : %s \n", header->magic );
    printf("type : %d \n",ntohl(  header->type ) );
    printf("len : %d \n", ntohl( header->len ) );
   
    bzero(buf,BUFSIZE);
    memset((unsigned char*)&buf,0x00,BUFSIZE );   
   
    sleep(1);   
   
    strcpy(header->magic, "FWMGR");
    header->type = 1;
    header->len = 2;   
    write(client_sd, header, sizeof(PHeader));
  //}

  close(client_sd);
  close(server_sd);

  return 0;
}


//---------------------------------------------------
Client

import java.net.*;
import java.io.*;
import javolution.io.*;

public class Client{  
  Socket socket = null; 
  protected String host;
  protected int port;
  protected String cmd;
   
  protected InputStream is;
  protected OutputStream os; 
 
  public Client(String host, int port){
    this.host = host;
    this.port = port;

    init();
    start();
    stop();   
  }
 
  public synchronized void init(){
    if(socket == null){
      try{
        socket = new Socket(host, port);       
        os = socket.getOutputStream();
        is = socket.getInputStream(); 
      }
      catch(IOException ioe){
        ioe.printStackTrace();
        stop();
      }
    }
  }
 
  public void start(){
    try{
      Student header = new Student();
      header.magic.set("FWMGR");
      header.type.set(1);
      header.len.set(2);   
       
      header.write(os);
      header.read(is);     
     
      System.out.println(header.magic.get());
      System.out.println(header.type.get());
      System.out.println(header.len.get());
    }
    catch(IOException ioe){
      ioe.printStackTrace();
      stop();
    }
  }
 
  public synchronized void stop(){
    try{
      socket.close();
      is.close();
      os.close();
    }
    catch(IOException e){
    }
  } 
 
  public static void main(String[] args){
    Client client = new Client("127.0.0.1", 6331);
  }
}


//---------------------------------------------------
Struct Class

import javolution.io.Struct;
    
public class Student extends Struct{
  public UTF8String  magic = new UTF8String(5);
  public Signed32 type = new Signed32();
  public Signed32 len = new Signed32();
}