cin.getline에서 공백 값이 들어갑니다...
글쓴이: balgarac1 / 작성시간: 일, 2015/11/15 - 11:21오후
프로그램의 구조는 클라이언트와 서버에서 프로토콜을 주고 받는 형식입니다.
간단하게 메세지 형식을 보여드리면
#define UB2 unsigned short #define UB4 unsigned int #define SCHAR signed char #define auth_req_msg 1 #define auth_res_msg 2 #define sql_req_msg 3 #define sql_res_msg 4 #define close_req_msg 5 #define close_res_msg 6 #define SELECT 1 #define UPDATE 2 #define DELETE 3 typedef struct _dgt_auth_req_msg { UB2 msg_type; SCHAR db_user[33]; SCHAR password[33]; SCHAR program_name[63]; SCHAR db_name[33]; }dgt_auth_req_msg; typedef struct _dgt_auth_res_msg { UB2 msg_type; UB2 rtn_len; SCHAR rtn_msg[257]; }dgt_auth_res_msg; typedef struct _dgt_sql_req_msg { UB2 msg_type; UB4 sql_len; SCHAR sql_text[1025]; UB2 sql_type; }dgt_sql_req_msg; typedef struct _dgt_sql_res_msg { UB2 msg_type; UB4 rtn_len; SCHAR rtn_data[1025]; UB2 sql_type; }dgt_sql_res_msg;
이렇게 되어 있습니다.
클라이언트에서 _dgt_auth_req_msg 메세지를 보내면 서버에서는 _dgt_auth_res_msg 를 보냅니다.
잘 안풀리는 점은 서버와 클라이언트에서 로그인 처리를 하고 메세지를 주고 받는 처리를 할 때 생깁니다.
클라이언트 쪽에서
cout << "ID:"; cin >> req.db_user; cout << "Password:"; cin >> req.password; cout << "DB Name:"; cin >> req.db_name; strcpy((char *)req.program_name, "simpleDB_Client"); // cout << "program name:" << req.program_name << endl; req.msg_type = auth_req_msg; // set msg type 1 send(m_nSock, (void *)&req, sizeof(req), 0); // msg type 1 send to proxy //// block //// ///////////////////////////////////////////recv/////////////////////////////////////////////// int a_resLen = sizeof(dgt_auth_res_msg); cout << "resLen size : " << a_resLen << endl; int a_recvCnt = 0; int a_strLen; memset(m_pbuf, sizeof(m_pbuf), 0); while(a_recvCnt < a_resLen) { a_strLen = recv(m_nSock, m_pbuf + a_recvCnt, BUFSIZ, 0); if(a_strLen == -1) { perror("net_Login () error"); } a_recvCnt += a_strLen; // cout <<"in while loop recv..." << endl; } res = *(dgt_auth_res_msg *)m_pbuf; // buf to dgt_auth_res_msg if(res.msg_type != auth_res_msg) perror("net_LogIn Wrong Message Pakcet.."); else { cout << res.rtn_msg << endl; int nRet = net_DBquery(); if(nRet < 0) return -1; }
아이디와 패스워드 등을 입력받고 메세지를 채워서 서버로 보냅니다. 서버는 제대로 된 메세지가 왔는지 확인하고 응답 메세지를 보냅니다.
그 후에 쿼리문을 입력 받아서 서버와 메세지를 주고 받을 때 입력하지도 않은 공백값이 들어가서 서버로 전송됩니다..
CNetwork::net_DBquery () { ///////////////////////////send sql//////////////////////////////// while(true) { cout << "SQL >"; cin.getline((char *)sqlReq.sql_text, 1024, '\n'); //cin.getline((char *)sqlReq.sql_text, 1024); if(!strcmp("exit", (const char *)sqlReq.sql_text)) return -1; sqlReq.msg_type = sql_req_msg; // set sql message type strcpy(m_chSqlText, (const char *)sqlReq.sql_text); sprintf(m_chSqlType, "%s", m_chSqlText); m_nRetType = net_sqlTypeCheck (m_chSqlType); sqlReq.sql_type = m_nRetType; // set sql type sqlReq.sql_len = strlen((const char *)sqlReq.sql_text); // sql len // cout << sqlReq.sql_text << endl; // print message send(m_nSock, (void *)&sqlReq, sizeof(sqlReq), 0); /// block /// //////////////////////////////////recv sql/////////////////////////////// int resLen = sizeof(dgt_auth_res_msg); memset(m_pbuf, sizeof(m_pbuf), 0); while(m_recvLen < resLen) { // cout << "DB_Query recv error1."<< endl; m_recvCnt = recv(m_nSock, m_pbuf + m_recvLen, BUFSIZ, 0); if(m_recvCnt == -1) perror("net_DBquery () recv error.."); m_recvLen += m_recvCnt; // cout << "DB_Query recv error2." << endl; } sqlRes = *(dgt_sql_res_msg *)m_pbuf; // buf to dgt_sql_res_msg if(sqlRes.msg_type != sql_res_msg) { cout << "sql msg type:" << sqlRes.msg_type << endl; perror("net_DBquery () wrong response packet.."); continue; } cout << "Result:" << sqlRes.rtn_data << endl; } return 1; }
제 생각에 cin.getline이 문제인 것 같은데 다르게 바꿔보아도 잘 고쳐지지가 않아서 질문을 남깁니다.
질문 내용이 길지만 가르쳐주시면 감사하겠습니다..
Forums:
음..
cin.getline이 논블럭 함수인거 같네요...
예제를 만들어봤습니다.
6시간 걸려서 만들었습니다. 참고해보세요.
윈도우XP 32비트. DevC++ 을 사용했습니다.
컴파일 할때는. 압축파일을 바탕화면에 풀어놓고. DevC++의 프로젝트 옵션에서 라이브러리 경로만 변경해주시면 될겁니다.
DevC++은 버전이 2가지니. 주의하시기 바랍니다.
그리고. 각종 오류가 났었던. 정보를 함께 추가했습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기