생선된 소켓을 닫을려고 하는데... 잘 안닫여요...
안녕하세요...
제가 메신저 서버를 만들고 있는데...
소켓을 닫는 처리를 했는데... 안닫여요... ㅜㅜ
이 두함수는 첫번째 것은... 사용자가 연결 요청이 들어오면 수락해서 소켓을 생성하는 함수구요.
두번째 것은.... mysql과 연동하여 인증처리하는 것인데... 연결을 끝어도... 새로 접속하는 소켓 번호가 연결이 끊어진 번호가 아니고...
모두 새로운 번호로 되는데... 예전에...
shutdown(clnt_sock, SHUT_WR); 출력 스트림만 종료해주면 연결이 끊긴것으로 알고 있는데...
연결이 계속 남아있내요...
어떻게 종료해줘야 할까요?
void *clntLoginCheck(void *arg)
{
cout
string strMessege;
int serv_sock, clnt_sock;
struct sockaddr_in serv_addr, clnt_addr;
pthread_t idIdPwCheck;
socklen_t clnt_len;
fd_set read, temp;
int fd_max;
struct timeval timeout;
fd_set clnt_read;
struct timeval clntout;
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5605);
if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)))
{
cout
}
if(listen(serv_sock, 10)==-1)
{
cout
}
FD_ZERO(&read);
FD_SET(serv_sock, &read);
fd_max = serv_sock;
while(1)
{
temp = read;
timeout.tv_sec = 2;
timeout.tv_usec = 0;
select(fd_max+1, &temp, 0, 0, &timeout);
if(FD_ISSET(serv_sock, &temp))
{
clnt_len = sizeof(clnt_addr);
clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_len);
cout
if((pthread_create(&idIdPwCheck, NULL, idPwCheck, (void*)clnt_sock)!=0))
{
cout
}
}
}
}
void *idPwCheck(void *arg)
{
cout
string szMsgBuf;
string szMessage, szUsrid, szUsrpw;
string szSQL;
string szSndMsg;
int clnt_sock;
int pos, nRmsgSize;
fd_set read;
int fd_max;
struct timeval timeout;
int sockBufSize;
socklen_t optlen;
MYSQL_RES* res ;
MYSQL_ROW row ;
int nFieldCnt;
int cnt;
clnt_sock = (int)arg;
FD_ZERO(&read);
FD_SET(clnt_sock, &read);
fd_max = clnt_sock;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
optlen = sizeof(sockBufSize);
getsockopt(clnt_sock, SOL_SOCKET, SO_RCVBUF, &sockBufSize, &optlen);
szMsgBuf.reserve(sockBufSize);
cout
select(fd_max+1, &read, 0, 0, &timeout);
if(FD_ISSET(clnt_sock, &read))
{
nRmsgSize = recv(clnt_sock, &szMsgBuf[0], 201, 0);
if(nRmsgSize>5)
{
szMsgBuf = szMsgBuf.c_str();
szMsgBuf.resize(nRmsgSize-1);
szMessage = szMsgBuf.substr(0, 6);
if(szMessage == "LGINCH")
{
szMsgBuf = szMsgBuf.substr(7, szMsgBuf.size());
pos = szMsgBuf.find(" ");
szUsrid = szMsgBuf.substr(0, pos-1);
szUsrpw = szMsgBuf.substr(pos+1, szMsgBuf.size());
szSQL.reserve(100);
sprintf(&szSQL[0], "Select * from test where usrid='%s' and usrpw='%s' limit 0, 1;\0", szUsrid.c_str(), szUsrpw.c_str());
if(mysql_query(&mysql, szSQL.c_str()) )
{
printf("%s\n", mysql_error(&mysql));
exit(1) ;
}
res = mysql_store_result(&mysql);
mysql_num_fields(res);
row = mysql_fetch_row(res);
if(row==NULL)
{
szSndMsg = "LGFAIL";
send(clnt_sock, &szSndMsg[0], szSndMsg.size(), MSG_NOSIGNAL);
shutdown(clnt_sock, SHUT_WR);
close(clnt_sock);
}
else
{
FD_SET(clnt_sock, &sock_fds);
pthread_mutex_lock(&mutx);
clnt_socks[szUsrid.c_str()] = clnt_sock;
clnt_times[szUsrid.c_str()] = time(NULL);
int_socks.push_back(clnt_sock);
sock_fd_max = *max_element(int_socks.begin(), int_socks.end());
pthread_mutex_unlock(&mutx);
sprintf(&szSndMsg[0], "LGINOK:%s\0", szUsrid.c_str());
szSndMsg = szSndMsg.c_str();
cout
send(clnt_sock, &szSndMsg[0], szSndMsg.size(), MSG_NOSIGNAL);
// 로그인시에 접속해 있는 칭구들한테 메시지 날려줘야함...
// 아직 구현하지 않음
}
}
}
}
else
{
szSndMsg = "LGFAIL";
send(clnt_sock, &szSndMsg[0], szSndMsg.size(), MSG_NOSIGNAL);
shutdown(clnt_sock, SHUT_WR);
close(clnt_sock);
}
}
댓글 달기