한국어 English Chinese Russian

자주 묻는 질문들 / 기술지원


No.95 Windows/Linux socket 프로그래밍시 유의사항 08-09-2004
카테고리 : 유틸리티/utility

ezTCP와 연결되는 Widnows 또는 Linux용 socket프로그램 개발시 유의해야할 예외 처리 항목들을 정리해보았습니다.


1. Connection close


1) Windows

- Async socket동작이 지원되기 때문에 상대방의 접속 종료 시 특정 함수가 호출되어 접속 종료 여부를 쉽게 알 수 있습니다.


2) Linux

- synchronous socket 동작만이 지원되기 때문에 recv함수의 리턴값이 0인지를 항상 확인해야합니다. 리턴 값이 0 이면 상대방이 접속을 종료한 상태입니다.


2. Connection reset


- ezTCP가 리셋되거나, 3분여 정도 동안 네트웍이 끊어져 있는 경우 keep_alive timer에 의해서 ezTCP가 기존 접속을 리셋시킬 수 있습니다. ECONNRESET에러 발생시 참고 하시기 바랍니다.


3. Broken pipe


- TCP 데이터 전송 중에 상대방이 접속을 종료하거나 리셋시키면 EPIPE라는 에러가 발생합니다. 연결이 끊어져서 데이터를 계속 전송할 수 없다는 의미입니다. 데이터 전송루틴 작성시 이 문제에 대한 처리를 꼭 하셔야합니다.


4. BSD recv()함수 또는 Windows Receive()함수 사용시 주의사항


- recv()나 Receive()함수에서 사용하는 length인수는 데이터 수신용 버퍼의 크기입니다. 즉, 읽어올 데이터의 최대 크기를 커널에게 알려주는 값입니다. 이를 실제 읽어올 데이터의 크기로 잘못 알고계시는 경우가 있으니 주의하시기 바랍니다. 이 함수의 리턴값이 실제 수신된 데이터의 크기입니다.


5. TCP stream의 정확한 이해


- TCP는 stream의 개념을 기반으로 데이터 전송이 이루어집니다. send()함수로 전송되는 데이터 블럭의 크기에 상관 없이 연속적인 데이터의 흐름으로 처리된다는 의미입니다. 블럭단위의 데이터 처리 방식을 사용하는 프로그램 개발시 stream의 개념을 잘못 이해해서 잠재적인 버그를 남겨두는 경우가 가끔씩 발생하고있습니다.
한 쪽 컴퓨터가 send()함수로 512byte의 데이터 블럭을 전송하고 다른쪽 컴퓨터가 recv()함수로 수신할 때, 512byte의 데이터가 한번에 수신된다는 보장이 없습니다. 대부분의 경우 512byte가 한번에 읽어지지만, 물리적 네트웍 구조나 커널의 처리 형태에 따라서 256byte씩 나뉘어서 수신될 수도 있습니다.
그 반대로 256byte의 데이터를 2번 보내면 상대방 컴퓨터에서는 512byte가 한꺼번에 수신될 수도있습니다. ezTCP와 연계된 응용 프로그램 작성시 stream처리에 유의하시기 바랍니다.


6. Listening address 재 사용


- PC가 서버로 사용되는 경우 프로그램은 접속 대기용 포트를 bind해야합니다.
그러나 기존 connection을 PC쪽에서 먼저 끊고 프로그램을 종료한경우 포트가 TIMED_WAIT상태로 남아있기 때문에 bind가 안되는 경우가 있습니다.
이런 상태는 DOS창에서 netstat -a 명령이나, Linux의 netstat -t 명령으로 확인이 가능합니다. 포트가 TIME_WAIT상태에서 벗어나려면 보통 30초~몇분 정도가 소요됩니다.
몇 분후에 다시 프로그램을 실행시키면 되지만 TIMED_WAIT 상태가 문제가 되는 경우에는 setsockopt에서 SO_REUSEADDR옵션을 사용하면 기존 포트를 다시 bind할 수 있습니다.




See also

  FAQ No.90 소켓 프로그램을 했는데 데이터가 잘려서 들어옵니다.


Related Products