TCP 이상 연결 종료에 관한 질문입니다.

ban717의 이미지

안녕하세요 KLDP 사용자 여러분

저는 한국항공대학교 컴퓨터공학과 대학원에 재학중인 학생입니다.

제가 맡고 있는 프로젝트에 문제가 있어 여러분에게 조언을 듣고 싶어 글을 올립니다.

간단하게 제가 하고 있는 프로젝트에 대해서 말하면
서버(c++)와 클라이언트(wipi)로 크게 나누어 집니다.

서버는 클라이언트와 tcp 연결후 udp를 통해 계속적으로 데이타를 날려주고
클라이언트는 udp를 통해 데이터를 계속 받으면서 연결된 tcp를 통해 커맨드를 보냅니다.
커맨드에 따라 서버에서도 응답을 해주고요
모든 데이터 전송은 정해진 프로토콜 포맷에 의해 주고 받습니다.

근데 이 과정에서 tcp 연결이 종료되는 현상이 벌어집니다.
udp를 전송하면서 부터 커맨드를 보내지 않으면 아무런 문제가 없는데요
한번이라도 tcp를 통해 커맨드를 보내면 바로 또는 얼마 안있어 종료가 됩니다.
보통 3분을 넘지 못하는 거 같네요

tcp 커맨드를 처리하기 위해 서버에서는 select를 통해 tcp 전송 유무를 확인하며 udp전송을 하고 있습니다.
현재 서버 운영체제는 윈도우입니다.( 원래 리눅스에서 진행하다가 태클이 있어서 윈도우로 바꾸게 되었습니다. 쩝 ㅡ.ㅡ;;)

그럼 KLDP 사용자분들의 많은 조언 부탁드립니다.

mach의 이미지

tcp 연결만 끊기나요? 아니면, 프로그램이 종료되나요?
서버에서 tcp명령을 정상 수신하는가에 대한 검토는 해봤나요?
하나의 명령이 완전하게 수행된 후 연결이 단절되는 것인가요?

질문을 위한 정보부족으로 답변이 참 난해하겠군요
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ban717의 이미지

제가 질문을 자세하게 적지 못했네요

제가 하는 것은 이미지를 스트림 방식으로 전송하면서 단말기로부터 커맨드 처리를 하는 것입니다.

이 처리를 위해 select()를 통해 클라이언트 소켓을 검사해 단말기로부터 커맨드 처리가 들어오는지 확인하면서 udp로 전송하고 있습니다. udp로 전송시에는 이미지 크기가 18000바이트정도되는데 5000바이트로 잘라서 이미지를 모두 보내고 다시 커맨드가 들어왔는지 확인합니다.

tcp 연결만 끊기는 것으로 보이고요 프로그램은 종료되지 않습니다.
그리고 tcp명령은 언제나 정상 수신하고요 명령이 완전하게 수행된 후 연결이 단절됩니다.

제가 WSAGetLastError()를 써서 오류 체크를 하면 정상적인 종료이거나 10054라는 에러가 검출됩니다.
10054이면 원격 호스트에 의해 재설정되었음 된 것이라고 하는데요 왜 발생하는지 알수가 없네요

서버에서 tcp 소켓 옵션
setsockopt(tcp_server_sockfd, SOL_SOCKET, SO_REUSEADDR, (const char *) &one, sizeof(one));
setsockopt(tcp_client_sockfd, IPPROTO_TCP, TCP_NODELAY, (const char *) &one, sizeof(one));

서버에서 select()를 통한 클라이언트전송검사
fd_set reads, temps;
TIMEVAL timeout;

timeout.tv_sec = 0;
timeout.tv_usec = 1000;

FD_ZERO(&temps);
FD_ZERO(&reads);
FD_SET(stcp_client_sockfd,&temps);

int result;

while(1){

reads = temps;

if(select(0, &reads, 0, 0, &timeout) ==SOCKET_ERROR)
{
printf("select fail");
return FAIL;
}

if(FD_ISSET(stcp_client_sockfd, &reads)!=0)
{
result = commandProtocolcheck();
if(result!=SUCCESS)
return result;
Sleep(500);

}
else
{
여기서 udp전송......
}

}

클라이언트 소스는 제가 가지고 있지 않아서 어떻게 되어 있는지 지금은 알수가 없네요
그럼 답변 부탁들입니다.

mach의 이미지

Quote:
tcp 연결만 끊기는 것으로 보이고요 프로그램은 종료되지 않습니다.
그리고 tcp명령은 언제나 정상 수신하고요 명령이 완전하게 수행된 후 연결이 단절됩니다.

제가 WSAGetLastError()를 써서 오류 체크를 하면 정상적인 종료이거나 10054라는 에러가 검출됩니다.
10054이면 원격 호스트에 의해 재설정되었음 된 것이라고 하는데요 왜 발생하는지 알수가 없네요


서버가 윈도우에서 수행중인가보군요.
하여간, 클라이언트측에서 끊었다는 의미로 보입니다.

보다 분명히 하기 위해, 프로토콜을 살펴볼 필요가 있을 듯 합니다.
tcpdump, ethereal/wireshark을 사용하여 덤프를 볼 필요가 있어 보입니다.
tcp 부분만 덤프를 보면 되겠군요. 최초 연결후 부터, 명령어 하나 보내고(클라이언트), 서버처리하고(서버), 서버응답받고(? 클라이언트) , 연결이 끊기는 시점까지를 볼 필요가 있습니다.

클라이언트가 프로토콜 오류를 인지하고, 끊어버릴 가능성이 있습니다. 예를 들어, 명령어를 하나 보내면, 서버가 어떤식으로 응답해야 하는데, 이에 대한 오류가 있을 경우 보통 클라이언트는 연결을 끊겠지요.(또는 서버가, 그런데, 질문자님의 경우에는 클라이언트가 끊는다는 얘기인데요)
이를 분명하게 하기위해서 덤프를 볼 필요가 있습니다.
클라이언트가 FIN 또는 RST를 보내는 것을 확인해 본 후 만일 그러하다면, 프로토콜(명령어 주고받는)쪽의 문제가 아닐까?라는 생각을 해봅니다. 하여간, 클라이언트측 소스가 없다면 디버깅이 좀 어려워지겠군요.

* keepalive타임을 초과해서 끊긴 경우로는 보이지 않으며, 또한 중간에 스위치, 라우터, IPS등의 장비에 의한 단절등을 의심해 볼 단계가 아닌듯합니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.