tcp 통신 write 반환 값
구글 검색 ai에서 나온 nio writable 처리를 보면 이렇쩌.
이거는 쓰기를 치는데 write 반환 값이 모잘르게 잘리는 현상에 대응한 거여요.
2048 패킷을 보내면 1440 보냈음 이런 태도로 608 패킷이 남아버렸쩌. 사실 이거는 이더넷 프로토콜에 전송 단위로 1500 MTU 이내에 걸리고 tcp 통신은 이거보다 적은 데이터를 넣었다 하더라도 즉시 flush 하지 않고 nagle 기법으로 전에 패킷을 모아서 보내어요. 이럼 지연 시간이 늘어나지만 오버헤드를 최대로 줄이겠쩌.
// Assume 'selector' is a Selector, 'key' is a SelectionKey, 'channel' is a SocketChannel
SelectionKey key = ...; // Obtained from selector.select()
SocketChannel channel = (SocketChannel) key.channel();
ByteBuffer buffer = (ByteBuffer) key.attachment(); // Your data buffer
if (key.isWritable()) { // Check if channel is ready to write
while (buffer.hasRemaining()) { // Write until buffer is empty
int bytesWritten = channel.write(buffer);
// Handle partial writes (though usually not needed if buffer is managed well)
if (bytesWritten == 0) {
// Buffer full, stop writing for now, keep OP_WRITE set
break;
}
}
if (!buffer.hasRemaining()) {
// All data written, stop monitoring for write for now
key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);
// Or if done with this connection:
// key.cancel();
}
}
WSASend 함수(winsock2.h) - Win32 apps | Microsoft Learn
지난 주에 유튜버 유영천님이 스트리밍에서 윈속 wsasend 함수이던 send 함수이던 윈도우 소켓 전송에 반환 값이 모잘르게 나오는 경우를 본 적이 있는지 물었어요. 다른 분들도 본 적이 없다는 얘기이었던거 같은데요.
WSA_IO_PENDNG이 걸렸음 작업이 완료되고 lpNumberOfBytesSent 상태를 받아요.
그런데 리눅스이던 윈도우이던 송신 버퍼가 크고, 수신 버퍼는 더커요. tcp 슬라이드 윈도우 기능으로 여분을 타협하여 이렇쩌.
만일 변태 개발자이어서 소켓 통신에 16k, 64k버퍼 이런거 안하여서 1 ~ 2k 버퍼만 사용하였다 이럼 많이 짤라 먹을 여지가 많아져요.
이런 프롬프트: 안드로이드에서 nio 모델 tcp 소켓 채널에 SO_SNDBUF SO_RCVBUF 버퍼를 2048 크기로 하는 코틀린 예시를 알아봐줄래?
(gpt 응답 / 다른 코드 생략)
socketChannel.setOption(java.net.StandardSocketOptions.SO_SNDBUF, 2048)
socketChannel.setOption(java.net.StandardSocketOptions.SO_RCVBUF, 2048)