[완료]리눅스에서 난게 아니지만 올려봅니다. ;;

tkfkdgody의 이미지

안녕하세요.
윈도우 서버, 클라이언트 프로그래밍이 구현되어 있는 프로그램에서
처음에 클라가 죽으면서 서버가 내려가길래 디버깅을 통해
클라이언트의 recv함수가 호출된 시점에서 클라가 종료가 되면
서버가 같이 내려가는 현상이 있는 줄 알았습니다.
그래서 select로 구현을 하여 recv함수를 매번 타지 않게 하면
되겠구나 하여 select로 구현을 해놨는데 제가 문제를 잘못 파악하고
있었네요.

클라가 도는 중 ctrl+c키로 종료 시 죽으면서 문구는,

Quote:
"0x1048be61"에 있는 명령이 "0x00431ab0"의 메모리를 참조했습니다. 메모리는 "read"될 수 없었습니다.
프로그램을 마치려면 [확인]을 클릭하십시오.

클라를 끄는 방법에 따라 서버가 죽을때도 있고 아닐 때도 있습니다.
아래는 시도해본 방법입니다.
1. 클라의 도스창을 x 를 클릭해 끄기 (서버도 죽습니다.)
2. 클라의 도스창을 ctrl+c키로 끄기 (서버도 죽습니다.)
3. 클라의 실행자체를 브레이크 포인트가 걸리지 않은 상태에서 디버깅 상태로 실행하고
    shift+f5키로 끄기 (서버가 죽지 않습니다.)
4. 클라의 실행자체를 브레이크 포인트가 걸리지 않은 상태에서 디버깅 상태로 실행하고
    그 상태에서 도스창을 x로 끄기 (서버도 죽습니다. 그런데 이런 에러를 띄웁니다. 
    Unhandled exception in xxx.exe (MSVCP60D.DLL) : 0xC0000005 : Access Violation)

구글을 통해 찾아봤는데 이 문제로 인해 죽겠다고 호소하는 이들만 있고 ㅋㅋㅋ;;
도통 해결책은 안보입니다. 혹시 아시는 분 계실까요?;;
미천한 제 생각으로는 클라이언트가 죽으면서 처리되는 부분의 문제 같은데 그 이후 처리를
윈도우에서 어떻게 처리하는지 모르겠네요.; 이것도 맞는지는...;; 검증할 방법만 있다면 ㅜ.ㅜ

윈도우 문제를 여기에 질문 올려 죄송합니다. 여기가 좋아서리;;
답변 부탁드립니다.

chadr의 이미지

클라의 종료 방법에 따라서 서버가 죽는 현상 또는 안죽는건 우연입니다.
죽는다면 그게 당연한 현상이고 안죽는건 우연입니다.

제가 생각하기로는 서버에서 클라 접속이 끊어지면 정리가 제대로 안되는 문제 같습니다.
그로인해 이미 delete된 메모리 주소를 액세스하거나 메모리 주소를 넘어서는 경우일거 같습니다.

멀티스레드라면 동기화 문제일 경우도 있습니다.

소켓에서 클라의 접속이 끊기는 경우는 크게 세가지로 볼수 있습니다.

1. 서버가 끊는 경우
2. 클라가 connection reset으로 끊기는 경우
3. 클라가 정상적으로 끊는 경우

1번은 설명은 안하겠습니다. 나머지 경우에 전부 서버에서 체크하고 접속 종료로 인식해야합니다.
소켓 모델에 따라서 달라지지만 recv 함수가 -1을 리턴하거나 0을 리턴하는 경우 종료로 인식해야합니다.
recv 함수 뿐만 아니라 send 함수나 모든 소켓에 관련된 함수에서 체크를 해야합니다.

소켓은 에러처리가 중요합니다. 에러처리가 잘 되어야지만 프로그램이 정상적으로 돌아갑니다.

비동기 소켓의 경우 -1이 항상 접속 종료를 의미하는게 아니므로 윈도우에서 제공하는 WSAGetLastError함수로
에러코드를 얻어와서 처리 해줘야합니다.

이러한 소켓 종료처리는 윈도우나 리눅스에 따라서 달라지는건 거의 없습니다. 기본적인 방법은 동일합니다.

소켓 프로그래밍에서 서버가 죽는 경우는 자체적 데이터 처리가 제대로 못되어서 발생합니다.
소켓 api를 호출한다고 해서 절대 죽는 경우는 없습니다.

서버를 디버거 붙여서 돌려보세요. 그리고 서버가 죽는다면 죽는 부분에서 브레이크포인트가 걸릴겁니다.
이때 지역변수나 힙에 할당한 메모리를 하나씩 확인해보셔서 잘못된 데이터가 있으면 그부분을 중심으로
논리적 오류를 찾으시면 쉽습니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

tkfkdgody의 이미지

답변 감사합니다.

클라가 비정상적으로 죽으면서 서버가 죽는게 아니었네요..;;
서버에 select()로 구현 되어있는데요, 이벤트 발생했을 때

int ret = recv(...)
if (ret == 0)
{
...
}
 
else 
{
...
}

기존에는 저 위에처럼 구현이 되어 있었네요;; 저도 받은 소스라 보다 보니 오류가 리턴된 경우
즉 else if (ret < 0) 이 경우가 처리가 안되어 있었네요.;;

답변 감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.