오늘 한일
오늘 진짜 혼자일하는데 mysql 연결이 갑자기 안되서 화가 좀 났다.
평소에는 sql Lite를 써서 사용했지만 그냥 mysql workbench 사용해서 더미 데이터를 만들어 놓으려고 했다.
혼자 일하는 김에 엔진에서 mysql로 접근하게 하려고했는데
mysql 최신 버전 다운을 받았는데 실행해도 installer 창이 뜨지 않았다.
진짜 ㅋㅋㅋㅋㅋ ERROR를 뱉던가 해야되는데 실행된다고 말해놓고 실행이 안되니까 이유를 몰라가지고 고치느라 애먹었다.
운영체제 보안모드를 꺼서 그런가? 하기에는 영향을 줄 테스크가 아예없고, 진짜 이유를 몰라가지고 Stackoverflow에 쳐봤는데
가끔 버전에 따라서 문제가 있다고 하여 현재 버전인 8.38말고 8.37로 다운 받으니까 installer 가 실행되었다.
어찌저찌 해결하고 더미 데이터를 스크립트를 이용해서 넣어놨는데
엔진에서 mysql을 connection 해서 데이터를 가져오는 코드는 또 없었다.
진짜 개 화나는 부분이 Connection하는 코드도 없어가지고 mysql에 요청 보내서 직접 connection하는 함수도 내가 짜야했다.
전 부터 느끼는 거지만 바퀴를 만들지 말라는 말이 있는데 회사와서는 바퀴를 만드는 코드를 너무 많이 짠다는 것이다.
내가 짠것은 다른 잘하는 사람들의 코드에 비해 효율적이지도 않고 좋은코드일 확률이 적을텐데.... 상황에 없는 거를 직접 만들어야하는 상황이 너무 많다.
서핑하는 와중 외국 분이 짜놓으신 connection하는 코드가 있어서 dll 파일과 코드를 받아서 사용하려고하는데 이 외국분이 확인을 못한건지 dll 파일외 다른 파일에 이름이 하나 다른게 있어서 계속 Address ERROR 0x00032이런식으로 뜨는데 mysql 다운로드도 안된거도 그렇고 이거도 해결하는데 하루를 다버렸다 ㅋㅋㅋㅋㅋㅋㅋ 선임들도 없어서 해결해줄 사람도 없어서 혼자 했는데
머리 박아가면서 파일구조랑 좀 찾아보니까 coredesign파일이랑 core 파일 이름이 싱크가 안맞는거를 찾아서 대충 맞추니까 컴파일은 되었다.
ㅋㅋㅋㅋㅋㅋㅋㅋ 근데 여기서 마지막 문제가 터지는데 이 코드가 옛날 코드라 mysql5.0 버전 밖에 지원 안하는것......ㅋㅋㅋㅋㅋㅋㅋ
32비트환경에서 되는것이니 64비트에서 안될게 있나 생각이 들지만 저 사람이 짜놓은 core 라이브러리 파일에서 예외처리 부분인
not connection 분기문에서 EOFException 속성에 걸려서 연결이 안된다. EOF 에러는 연결 중간에 나타는 문제중에 일어나는데
찾아본 결과 여러가지가 이유가 될 수 있겠지만
먼저 첫번째 ,네트워크 연결 문제로 인해 데이터베이스 서버에 도달하지 못하는 경우(방화벽 등의 이유)
두번째 ,데이터베이스가 응답이 없거나
세번째, 호스트나 포트를 잘못 connect option으로 넣은경우
네번째, 데이터베이스 클라이언트 서버 간의 버전 차이로 연결이 안될 때
다섯번 째, 인증이 거부 되었을 때
여섯 번째 , 데이터베이스 설정 떄문에
6가지 경우가 있는데 아무리 봐도 지원을 5.0기준으로 만들었다는 외국인 성님께서 적어놓은 바로는 네번째인 데이터베이스와 클라이언트 버전차이로 연결이 안되는 것 같다.
더미 데이터 하나 미리 쌓아두려다가 하루를 어지럽게 보냈다.....
괜히 사서 고생한거 같은...... 일단 8.0 지원하는 코드로 바꾸던지 해야될텐데 우선순위가 아니긴해서.... 그냥 스펙타클한 경험을 했다고 생각해야겠다.
퇴근 후 공부
소켓의 옵션과 입출력 버퍼의 크기
소켓이란것은 사실상 데이터를 주고 받는 매개체이다.
소켓의 특성들은 웬만하면 데이티의 송수신과 관련된 것이다.
보통 입출력 버퍼의 크기 같은 것들은 옵션정보들도 있다.
이들을 옵션이라 이야기하는데 옵션이란 선택해서 바꿀수있는 특성을 이야기한다.
SOL_SOCKET = 소켓 자체의 기본적인 속성
IPPROTO_IP = 소켓에서 IP의 관련된 속성들
IPPROTO_TCP = TCP와 관련된 속성들
Get은 데이터를 받는것뿐이라 모든 속성 다 가능하다.
Set은 세팅하는것이기에 SO_ERROR나 SO_TYPE은 변경이 불가능하다.
옵션정보의 참조에 사용되는 함수
int getsockopt(int sock,int level, int optname, void p_optval, socklen_t p_optlen);
성공시 0, 실패 시 -1 반환
sock = 옵션확인을 위한 소켓의 파일 디스크립터 전달.
level = 확인할 옵션의 프로토콜 레벨 전달.
optname = 확인할 옵션의 이름 전달
optval = 확인결과의 저장을 위한 버퍼의 주소 값 전달
optlen = 네 번째 매개변수 opval로 전달된 주소 값의 버퍼크기를 담고 있는 변수의 주소값 전달, 함수호출이 완료되면 이 변수에는 네번째 인자를 통해 반환된 옵션정보의 크기가 바이트 단위로 계산되어 저장된다.
int setsockopt(int sock, int level, int optname, const void p_optval, socklen_t optlen);
성공시 0 실패시 -1 반환
sock = 옵션변경을 위한 소켓의 파일 디스크립터 전달.
level = 변경할 옵션의 프로토콜 레벨 전달.
optname = 변경할 옵션의 이름 전달
optval = 변경할 옵션정보를 저장한 버퍼의 주소 값 전달.
optlen = 네 번째 매개변수 optval로 전달된 옵션정보의 바이트 단위 크기 전달.
실제로 setsockopt로 우리가 버퍼 크기를 설정해보면 우리 맘대로 원하는 크기로 바뀌지 않는다.
버퍼 크기는 굉장히 중요하기 때문에 TCP 버퍼를 만들때 운영체제가 우리의 의견이 참고 하고 반영해주는 것이지 우리가 완전히 명시적으로 바꿔지지 않는다.
'일상,취미' 카테고리의 다른 글
다시 시작하는 TIL 23일차 (0) | 2024.07.08 |
---|---|
다시 시작하는 TIL 22일차 (0) | 2024.07.06 |
다시 시작하는 TIL 20일차 (0) | 2024.07.04 |
다시 시작하는 TIL 19일차 (1) | 2024.07.03 |
다시 시작하는 TIL 18일차 (0) | 2024.07.02 |