[완료] HttpSendRequest() 함수의 멈춤 현상에 대해서

naito의 이미지

한 대의 Windows PC에서 Linux가 설치된 PC에 HttpSendRequest()함수를 사용하여 CGI 전송을 하고 있습니다.

처음 접속시 CGI 하나를 보내서 데이터를 끊임없이 받아 옵니다.
데이터가 오고 있는 도중에 다른 CGI를 날려서 필요한 동작을 하도록 컨트롤 하고 있습니다.

이 동작을 동시에 여러 Linux PC에 접속을 해서 CGI를 보내도 큰 이상은 없습니다.
그런데 동일한 IP를 가지는 PC에 CGI를 보내면 HttpSendRequest()함수에서 프로그램이 멈춥니다.
예를 들어 한 대의 공유기에 여러 대의 Linux PC가 물려 있는 경우입니다.

그런데 이상한 것은 처음 접속하여 데이터를 가져오는 것은 문제가 없는데,
도중에 다른 CGI를 추가로 날리려고 HttpSendRequest()함수를 호출하면 이 곳에서 프로그램이 멈춥니다.

관련 자료를 찾아보니 Timeout기능에 문제가 있으므로 쓰레드를 하나 생성해서 HttpSendRequest()함수 호출을 하고,
원래 쓰레드에서 Timeout 기능을 실행시켜 문제의 쓰레드를 강제 종료 하라고 하더라구요.
이렇게 사용을 하고는 있습니만 해당 쓰레드를 강제 종료 시킬 경우 CGI가 제대로 호출이 안되므로 어떠한 동작도 할 수가 없게 됩니다.

이 상황에서 CGI를 확실하게 전송하는 방법이 있을까요?

조언 부탁드립니다.

shint의 이미지

저의 꽁수는 ㅡ_ㅡ;;;
1. send에서 continue를 잘못적용해서. 반복문 처리'하느라 멈춘것처럼 보이는 경우.
- 적절한 실패'를 해서 멈추지 않도록 break 넣어주기
2. sleep등이 적용되지 않은 상태'에서 너무 빠르게 많은 양'을 무작정 전송한 경우.
- 적절한 sleep을 적용해줍니다. 0~300정도...
3. 최대한 점유율'이 100%가 되지 않고 90% 정도'에서 처리 될 수 있는 흐름'을 만들어 주면 좋습니다.
- 제한된 시간'안에 처리'되는 량'을 정해두고 개발하시면. 좋습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

naito의 이미지

CPU부하 때문에 그런 것은 아니구요.

아래와 같이 접속이 되면 잘 동작을 합니다.

http://1.1.1.1:80 접속 > PC http://2.2.2.2:80 접속 > —————————— PC 1.1.1.1 (Widows) http://3.3.3.3:80 접속 ==> | (Linux) | |———- PC 2.2.2.2 | (Linux) | ———- PC 3.3.3.3 (Linux)

그런데 아래와 같이 접속이 된 상태에서 추가로 CGI호출을 위해 연결을 하나 만들어 HttpSendRequest()함수를 호출시 멈춰 버립니다.

http://1.1.1.1:80 접속 > 80포트 PC http://1.1.1.1:81 접속 > ———— 공유기 ——————- PC (Widows) http://1.1.1.1:82 접속 ==> 1.1.1.1 | (Linux) | 81포트 |———- PC | (Linux) | 82포트 ———- PC (Linux)

이해가 가시려나 모르겠네요.
ip가 다른 Linux서버에 접속시에는 아무런 문제가 없습니다.
그런데 같은 ip를 가지는 Linux서버에 접속시 문제가 발생합니다.

아무래도 이 내용과 연관이 있는 것 같습니다.
http://support.microsoft.com/kb/183110#appliesto

각 Linux 서버에 대해서 데이터 스트림 전송을 위한 연결이 계속 되어 있는 상태구요.
추가로 CGI를 날리기 위해 연결을 새로 만들어 전송시 문제가 발생합니다.

MS의 내용에 의하면 접속 제한 때문에 그렇다는 것인데, 이상한 것은 같은 ip를 가지는 다른 Linux서버에 추가로 접속을 시도하면 접속은 됩니다.
다만 이미 접속된 Linux서버에 대해서 추가로 CGI전송시만 문제가 됩니다.

naito의 이미지

텍스트로 그렸더니 그림이 깨지네요.
아무튼 ip가 다른 여러대의 리눅스 서버에 접속시에는 동작이 잘 되지만
같은 ip를 가지는 리눅스 서버에 접속시에만 문제가 됩니다.
(ex:하나의 공유기에 리눅스 서버가 여러개 연결된 경우)

혹시 HttpSendRequest()함수를 대체할 만한 함수라도 없을까요?

naito의 이미지

그냥 http://support.microsoft.com/kb/183110/ko 에 나와 있는대로 연결 수를 늘려 버렸습니다.

HTTP 1.0을 사용하고 있기 때문에 MaxConnectionsPer1_0Server 값을 최대 연결 수보다 많도록 설정하니 별 다른 이상없이 동작하는 거 같네요.

댓글 달기

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