본문 바로가기

개발/react 생태계

c와 node.js tcp통신 -(2)

반응형

이전 포스팅에서 c언어로 개발된 back-office와 tcp 통신을 하는 과정을 다뤘습니다. 

잘려서 오는 byte를 다루는 library를 만들기 위해서는 

 

  1) 총길이가 12300byte일 경우 세번째로 자르면 4025byte 나 4023byte 혹은 그 이외 값으로 자르는지

  2) 위 과정이 출금 내역조회인데, 다른 계좌로 출금 내역 조회시 4025byte나 4023byte로 자르는지

  3) 입금내역 조회시에도 4025byte나 4023byte로 자르는지

 

위 세가지 조건을 확인해야했는데요.

 

코드를 더 파보니 4024byte로 back-office에서 임의적으로 자르고 있었습니다.

뭐 tcp가 자르든, back-office에서 자르든 일단 잘려서 오니 library개발을 진행했습니다.

(참고로 tcp 기본 잘리는 단위는 4096byte였던거 같습니다.)

 

input에 대한 output, io가 tr(통신)마다 달라 각 tr마다 약간씩 다르긴 했는데 모듈을 대부분 아래와 같았습니다.

let input = **********
let buffer = new Uint8Array([]);
  
  
  let getSocketRes = new Promise((resolve) => {
    socket.on("data", async (socket_res) => {
	 //쪼개져 오는 buffer를 합치는 process
     buffer = Uint8Array.from([...buffer, ...socket_res])
     buffer = new Uint8Array(buffer)
     buffer = Buffer.from(buffer);

    //header분석
    let array_count = await js.analyzeHeaderH(buffer, 30)
    
    if (array_count === "123456" && array_count !== -1) {
      socket.removeAllListeners()
      resolve({
        s: 1,
        m: response_text["1"],
      }); 
      return;
    }
      
    })
  })

  socket.write(input);
  res.send( await getSocketRes)

 

analyzeHeaderH는 다음과 같았습니다.

  var analyzeHeaderH = (buffer, body) => { 
    return new Promise ( (resolve, reject) => {

        let buffer_len = Number(buffer.byteLength)
        let gap = 4024
        
        //4024넘길경우 헤더(24)가 추가되서 오므로, 4024단위로 24byte추가를 위해 필요
        let adding_header = Math.floor(buffer_len/gap)
        let array_count =  null;

		.
		.
		.
        
      
        if(message_order !== "L" ||  message_kind !=="M") {
            resolve(-1);  //끝이 아닐경우 -1 리턴
            return;
        } else {
            array_count = message.slice(24,29).toString()
            resolve(array_count) //끝이면 state 코드 리턴
            return;
        }
     
    
    })
}

 

첫번째 코드에서 주목할 것은 socket.socket.removeAllListeners()입니다.

node의 net 모듈로 socket 통신시, 이전 값이 더해져서 응답이 와 머리를 아프게 했었습니다. 이전값이 더해져서 오면 byteLength는 점점 길어지고, response의 끝을 알수가 없으니 참 난감하죠. 

 

이 현상을 해결시켜준게 socket.socket.removeAllListeners()입니다.  찾아보니 특정 리스너를 제거해준다고는 하는데....음 저에게는 응답이 온뒤 이전 response는 덧붙여서 오게해주지 않더라고요.

 

 

 

느낀점:

 

서버간 통신을 위해 tcp통신을 이용했고, byte가 점점 늘어나자 잘린 byte를 다루는 경험이 쌓였습니다.

buffer -> string, number, float과 string, number, float-> buffer도 해보니 많이 재밌었습니다.  그리고 소프트웨어 업계가 빠르게 변한다지만, 기존에 있던 코드와 proccess를 아예 무시하긴 어렵기에 원시언어들(c, c++, python, java...)들을 인지해야한다는점이 개발자의 중요 소양중 하나임을 이번 기간동안 느꼈습니다.  앞으로 더 열심히 해야겠네요!

 

 

감사합니다.

 

 

 

 

 

코드가 보기 어려울경우 이 링크를 참조해주세요: https://medium.com/%EB%8F%84%EA%B9%A8%EB%B9%84-%EC%9D%B4%EC%95%BC%EA%B8%B0/c%EC%99%80-node-js-tcp%ED%86%B5%EC%8B%A0-2-5dff07e96804