연구소에서 프로젝트를 진행하던중 c언어로 개발된 back office와 통신할 경우가 생겨, node로 tcp 통신을 진행해야했습니다.
net 모듈을 이용하면 되는데, 사용법은 아래와 같습니다.
const net = require('net');
var client = new net.Socket();
var socket = client.connect({port: process.env.API_PORT, host: process.env.API_HOST});
//API_PORT: remote server port
//API_HOST: remote server host
socket.write(input) //메세지 전송
socket.on("data", (socket_res) => {
console.log(socket_res) //응답
})
그런데, 종종 socket_res가 세번 찍히는걸 볼수 있었습니다. 뭐지 하고 봤더니
const net = require('net');
var client = new net.Socket();
var socket = client.connect({port: process.env.API_PORT, host: process.env.API_HOST});
//API_PORT: remote server port
//API_HOST: remote server host
socket.write(input) //메세지 전송
socket.on("data", (socket_res) => {
console.log(socket_res.byteLength)
//1460
//8438
//451
})
1460, 8438, 451으로 세번 오고 있었습니다. 길이도 10301byte가 와야하는데, 10349byte라니.....
매번 3번이 아닌 두번에 걸쳐 1460, 8889오기도 해서 무슨 난리인가 싶었습니다.
결국 buffer를 모두 확인해본 결과, 24byte header가 2번 더 오고 있었고 tcp에서 일정 크기를 넘기면 데이터를 잘라서 보낸다는 사실을 알수있었습니다.
# 제 경우 0~4024+4025(추가 header: 4025~4049)~8047+ 8048(추가 header: 8048~5072)~10349였고,
첫번째는 4025byte로, 두번째는 4023byte에 잘랐습니다.
흠.... 일정하게 4025byte로 자르면 되는데 4023byte에 자른는 경우도 있다니.... 머리가 아프네요....
결국 잘리는 byte범위를 두고 해당 오차범위 내에서 header를 찾아 자르는 library를 개발해야했고, 제가 생각한 확인조건은 다음과 같았습니다.
1) 총길이가 12300byte일 경우 세번째로 자르면 4025byte 나 4023byte 혹은 그 이외 값으로 자르는지
2) 위 과정이 출금 내역조회인데, 다른 계좌로 출금 내역 조회시 4025byte나 4023byte로 자르는지
3) 입금내역 조회시에도 4025byte나 4023byte로 자르는지
다음 포스팅은 library 개발로 진행하겠습니다. 이상입니다!
코드보기가 어려우실경우 이 링크를 참조해주세요: 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-93f2b7ed1122
'개발 > react 생태계' 카테고리의 다른 글
Cannot read property 'match' of undefined (0) | 2021.01.09 |
---|---|
c와 node.js tcp통신 -(2) (0) | 2020.07.23 |
styled component in next.js (0) | 2020.07.16 |
Unhandled Runtime ErrorError: React.Children.only expected to receive a single React element child (0) | 2020.07.13 |
getStaticProps와 getServerSideProps in next.js (0) | 2020.07.09 |