블로그 이미지
대갈장군

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

2007. 10. 10. 04:08 프로그래밍

숙제가 있었다. TCP 커넥션을 만들어서 구성원들끼리 대화를 주고 받는 프로그램인데 특이한 점이라면 서버/클라이언트가 하나의 프로그램에 동시에 존재한다는 점과 한개의 파일로 어디서나 작동하게끔 만들어야 한다는 점이었다.

그닥 어렵지는 않다. 뭐 서버 클라이언트 관계는 못만들 이유가 없고 소켓만 잘 순서대로 연결해주면 아무 탈 없이 돌아갈 줄 알았다. 그런데 문제는 의외에 장소에서 터졌다.

프로그래머라면 당연히 관련된 정보는 하나의 구조체로 묶어서 관리하는 것이 좋다는 것을 안다. 그리고 나도 그대로 했다. 특정한 형태를 유지 시키기 위해서 구조체를 만들어서 각종 정보를 담아 두었다.

이 프로그램은 ssh를 이용해서 다른 컴퓨터에 접속한 다음 거기서 명령을 실행하는 것이 주 목적이다. 근데 이상하게도 바꾸지도 않았는데 구조체의 값들이 지 맘대로 변하는 것이 아닌가?

아무래도 이상해서 이리저리 테스트를 해보아도 도데체 이유를 몰랐다. 그런데... 알고보니...

구조체에 char *IP_addr이라는 멤버가 바로 문제 였다. 이 포인터의 값이 비록 내가 ssh를 이용해 원격 접속을 다른 컴퓨터에 하더라도 같은 값을 가지며 현재 사용중이 컴퓨터의 local memory를 가리킬 것이라고 생각 못했다.

분명히 다른 컴퓨터의 다른 주소에 위치 할 줄 알았는데 그게 아니었다. 그래서 아무리 값을 바꾸려고 해도 그 값들은 오직 같은 값만을 유지했던 것이다. 이런건 책에 나와 있는지 모르겠다. 아무튼 구조체 내에 절대로 포인터를 쓰지 말라는 말은 들어본 적이 없는 것 같다.

아무튼 저놈 때문에 금요일 오후를 홀딱 날렸다. 젠당.. 다음부턴 주의 해야지. 아, 해결법은, 구조체 내에 멤버를 선언할 때 char IP_addr[MAXLEN] 처럼 고정된 주소 공간을 가지는 형태로 바꾸고 strcpy를 이용해서 데이터를 입력해 넣었더니 '무슨 일 있었나요?' 라고 하며 바로 작동이 잘되었음... 젠당...


'프로그래밍' 카테고리의 다른 글

프로그램, 프로세스, 스레드  (2) 2008.10.22
객체 지향 언어(C++) V.S. 비 객체 지향 언어(C)  (2) 2008.10.18
왜 객체 지향인가?  (0) 2008.01.11
젠장할 Direct Show  (0) 2008.01.10
RPCGEN  (0) 2007.11.09
posted by 대갈장군