회사에서 간단한 UDP 소켓 프로그래밍을 할 일이 생겼다. 입사 후 1년 8개월 정도 되었는데 기껏해야 데모를 위한 웹 페이지를 만드는 정도였다. 지난달에 안드로이드 앱이 필요해 인터넷을 뒤지며 오랜만에 Java에 손을 적셨고, 이번에 이 프로그램을 짜면서 VC++에 발을 담갔다. 그런데 몇 가지 아주 기초적인 실수로 시간을 허비해서 적어본다.
struct data { int a; int b; }; struct data d; char msg[32]; // buffer ////////////////////////////////////////////////////// // ... (this part is omitted) ... // receive data from the network to the msg variable ////////////////////////////////////////////////////// strcpy(&d, message);
네트워크로 받은 값이 d에 제대로 복사되지 않는다. strcpy는 한 byte씩 복사하다가 값이 0이면 문자열의 끝이라고 생각하고 더는 값을 복사하지 않는다. 물론, strncpy를 해도 같다. 따라서 아래와 같이 memcpy를 이용해야 한다. 1
memcpy(&d, message, sizeof(d));
기초적인 내용인데 몇십 분을 헤맸다. 너무 오랜만에 C로 코딩해서 감이 없다.
다음은 샘플 소스에 있던 msg, strlen(msg) 부분을 보고 생각 없이 copy&paste를 해서 발생한 일이다.
send(sock, (char*)&d, strlen((char*)&d), 0);
위와 같이 하면 8bytes를 보내는 것이 아니라 d를 문자열로 봐서 8bytes 미만이 될 수도 있다. 내 경우엔 1byte가 됐다. 결국, 첫 번째 오류와 같다.
send(sock, (char*)&d, sizeof(d), 0);
이걸로 서버 프로그램이 잘못된 것이 아니냐며 관계자를 불렀다. '나는 프로그래머다'서 누가 말했듯, 자신에게 잘못이 없는지 생각하기보다 다른 사람이 잘못했을 것이라고 믿어버린 경우다. 나의 사소한 실수에 스스로 오그라들고 말았다.
프로그래밍도 감각을 잃으면 정말 사소한 곳에서 오류를 만들고 시간을 허비하게 된다. 틈틈이 프로그래밍을 게을리 말아야 겠다.
- 운이 좋아 d 내부의 a, b 값이 아주 크다면 제대로 값이 복사될 수도 있겠다. [본문으로]
'[아는게 힘이다] > [프로그래밍]' 카테고리의 다른 글
부분합(subsum) 문제 관련 (0) | 2016.02.25 |
---|---|
그래프 색칠하기 (0) | 2016.02.15 |
[C++/ACM] 820 Internet Bandwidth (0) | 2010.05.16 |
[알고리즘] Interval Scheduling (2) | 2010.04.29 |