2010-12-16 7 views
1

이유 : THIS 이유에 대해 뭔가 새로운 시도 - 일부 시스템 호출을 사용하여 소켓을 닫습니다.리눅스에서 클로징 소켓을 강제로 만드는 방법은 무엇입니까?

두 단어의 상황 - mysql 라이브러리 (C API, 자세한 정보는 링크 참조)의 쿼리 제한 시간을 설정할 수 없으므로 소켓을 닫아 라이브러리가 어떻게 반응하는지 확인하려고합니다. 아마 이것은 좋은 생각이 아니지만 여전히 시도하고 싶습니다.

다음은 내가 한 일입니다. 시작된 또 다른 스레드가 있습니다. 타이머입니다. 따라서 특정 제한 시간이 지난 후 (예를 들어 10 초) 응답이 없으면 소켓을 닫고 싶습니다. MYSQL 구조체는 구조체이기도 한 net 멤버를 가지고 있으며 fd을 보유하고 있습니다. 그러나 이것을 시도 할 때 :

shutdown(m_pOwner->m_ptrDBConnection->m_mysql.net.fd, SHUT_RDWR); 
close(m_pOwner->m_ptrDBConnection->m_mysql.net.fd);

아무 일도 일어나지 않습니다. shutdownclose에서 반환 값은 0하지만, 60 초 대기 후 DB에서 반환 된 결과가 있기 때문에 소켓은 여전히 ​​(열, 즉 mysql 클라이언트는 여전히 DB에서 응답을 기다리고 있다는 것을 의미한다.

하나를 아이디어

감사

편집 -?. 내가 소켓을 닫으려고하지만 실제 문제가있는 동안 예, 실행 트랜잭션이있다 - 나는 쿼리를 종료 할 수없고 연결을 닫습니다 , 아무것도, 나는 전체 시간 초과를 기다리고 싶지 않습니다. 그것은 20 분 30 초입니다. 이런 식으로. 그래서 내가 무차별 공격을 찾고 있어요. :/

+1

올바른 소켓인지 확인 하시겠습니까? –

+0

필자는'fd'가 올바른 FD라고 생각합니다. 열린 파일에 따라 달라집니다. 또한 이것은 MySQL 객체에서 FD를 보유 할 수있는 유일한 필드입니다 (struct, 실제로). –

+0

@ Nikolai - 어느 소켓이 어느 포트 번호에 해당하는지 알 수있는 방법이 있습니까? 이것이 올바른 소켓인지 100 % 확신 할 수 있습니까? (OS-RHEL4) –

답변

1

그냥 어둠 속에서 촬영하지만, 당신이 실행중인 트랜잭션을 종료/취소합니다. MySQL C API에 익숙하지는 않지만 활성 연결/쿼리가 있는지 확인하는 방법이 있다고 생각합니다. 여전히 실행중인 것이 있기 때문에 단순히 소켓을 닫을 수 없으며 커밋되거나 롤백 된 상태로 "해결 된"상태로 가져와야합니다. 나는 거기에서 시작해서 어떤 일이 일어날지를 볼 것이다. 데이터가 안정적인 "상태"가 아니기 때문에 보류중인 항목이 있으면 소켓 "무차별 공격"스타일을 종료하고 싶지 않습니다. 어떤 트랜잭션이 성공했는지, 어떤 트랜잭션이 성공하지 않았는지 알 수 없지만 연결이 갑자기 실패하면 MySQL은 보류중인 트랜잭션을 롤백 할 것이라고 상상합니다.

편집 : 나는 "MySQL이 폭주 쿼리를 중지"인터넷 검색을 통해 발견 한 내용에서이 합의는 사용하여 폭주/장기 실행 쿼리의 스레드를 종료 MySQL을 물어 것 같다

KILL thread-id 

소켓이 들어있는 MySQL 데이터 구조에서 스레드 ID를 사용할 수 있다고 생각합니다. IIRC에 그렇게하려면 슈퍼 유저 권한이 필요하지만 이것을 시도 할 수도 있습니다.

편집 # 2 : 분명히 MySQL이 너무 강력 실제로 쿼리를 종료하지 않습니다 소켓을 종료, 닫힌 연결을 다시 시작하는 페일 세이프 (fail-safe) 메커니즘을 제공합니다. 일단 닫으면, MySQL은 다른 것을 열고 질의를 완료하려고 시도합니다.이 기능을 끄면 소켓을 닫고 쿼리가 종료됩니다.

아래의 의견은 답을 찾은 방법과 그에 포함 된 생각 과정을 보여줍니다.

+0

나는 무차별 대공감에 관해 당신과 완전히 동의하지만, 나는 여전히 그것을 시도하고 싶다. 이유를 설명하기에는 너무 길다. 그리고 예 - 실행중인 트랜잭션이 있고 이것이 내가 어떻게하려고하는지입니다 - 어떻게 든 취소 할 수 있습니다. 나는 많은 방법을 시도했다. 그래서 내가이 상태에 도달했으며 소켓을 강제로 닫으려고합니다. –

+0

소켓을 닫을 때 트랜잭션을 알 수 있습니까? 트랜잭션에 대한 핸들/포인터가 있습니까? 아니면 단순히 트랜잭션이 활성 상태이고 참조 할 수있는 방법이없는 것입니까? – Will

+0

나는 준비된 쿼리에 대한 포인터를 가지고 있고 그것에 Execute를 호출한다. 이것이 당신이 의미하는 바라면. –

0

TCP 대기 타이머와 관련된 문제가 발생하여 결국 닫힙니다. [긴 이야기 짧음] 그건 일종의 피할 수없는 일입니다. 이것에 대한 또 다른 토론이있었습니다.

close vs shutdown socket?

0

내가 아는 한, shutdown()close()이 모두 0을 반환하면 소켓을 성공적으로 닫은 것입니다. 사실은 당신이 틀린 fd를 닫을 수 있었다이다. 또는 서버가 올바른 종료에 제대로 반응하지 못했습니다 (그렇다면 서버의 버그로 간주 될 수 있습니다. 데이터가 수신 될 때까지 기다릴 이유가 없습니다). 계속 을 지원하고 방법을 지원할 것입니다.

+0

man 페이지에 따르면,'shutdown'과'close'는 모두 성공하면 0을 반환합니다. 그리고 지원되는 * 방법은 간단하게 * 플러그를 잡아 당기는 것보다 더 나은 선택이 될 것입니다. 소켓, 말하려는 것 – Will

+0

나는 며칠 동안 그런 "지원되는"방법을 찾고있다. / –

관련 문제