perl socket 프로그래밍 도중 기이한 현상

acidd15의 이미지

미쳐 버릴것 같네요.

소켓을 사용해서 웹문서를 읽어오는 프로그램을 만드는데..전체 프로그램중에서 뼈대만드는 단계인데...초반부터 기이한 현상때문에 멈칫멈칫 하고 있습니다.진짜 미칠것 같음..--;

한강 굴다리가서 싱하형에게 그냥 존X 맞으면 정신좀 들까요?ㅎㅎ

while(sysread(SH,$read,1046)){

print $read;

}

웹문서는 utf-8로 인코딩된 html소스이구요.그걸 긁어오는데...양이 많으면 긁어오는 도중에 멈춰버립니다.죽는것도 아니고 그냥 멈춰있습니다..증상이 일정치 않습니다..while statement안에 print로 출력을 몇개 해주면 데이터가 더 잘나오거나 덜 나옵니다.--;헐...이게 뭔지..

아참 바디의 데이터는 crlf가 없습니다.한줄의 긴 스트링이구요.xml데이터입니다.약 35키로바이트 정도 됩니다..

그래서

while($read=<SH>){

모 요런식으로는 아예 헤더만 나오고 바디가 안나옵니다.

binmode(SH,":utf8");

을 하니..이건 또 utf8은 알수 없는 거라고 안되고...:crlf나 :raw는 먹히는데 :utf8이 안먹힙니다.

펄 버전은 5.6.1이구요...

아 그리고..마침 5.8이 깔린곳에서 테스트해 봤습니다.
:raw :crlf :bytes :utf8 별거 다해도 마찬가지임..

하루 종일 이 문제 풀지 못해서 php로 만들어 버릴까 하다가 왜 그런지 알기 전까진 절대 포기 할수가 없어 붙잡고 있습니다..ㅋㅋ 내가 이딴거 하나 해결 못하면...

참...--;; c로 하면 너무 시간이 오래걸릴것 같아서 perl로 해볼려했더니..흑..

pynoos의 이미지

보낼 때 keep alive가 되어서 그런것 아닌가요?

sysread가 종료될 때까지 while 하는 것이라면..

클라이언트가 요청할 때, 프로토콜을 1.0 으로 맞추시던지, Keep alive를 꺼서 보내보시는 것이 좋겠습니다.

acidd15의 이미지

http프로토콜과는 상관이 없지 않을지...--a;

pynoos의 이미지

strace 로 실행해보시면..

strace perl theprog.pl

뭐하고 있는지 알 수 있습니다.

cjh의 이미지

속편하게 LWP 모듈을 쓰시면 안되나요?

--
익스펙토 페트로눔

acidd15의 이미지

strace라는게 있었군요...

진작에 알았으면 좋았을 것을...

read(4, 0x8158c38, 1024) = -1 ECONNRESET (Connection reset by peer)

멈춰있는 부분에서 이런 줄이 나오더군요..

원격지(서버) 에서 접속이 리셋된거 같은데...

왜 이런 현상이 일어나는지는 이것을 토대로 찾고 있는 중이긴 합니다만...

혹시 아시는 분은 좀 알려 주시면 고맙겠습니다.

acidd15의 이미지

-_-;;바디의 사이즈는 34158바이트 인데 받아진건 또 34378이네요...--;왜 그럴까..메모리 릭???

cjh의 이미지

acidd15 wrote:
-_-;;바디의 사이즈는 34158바이트 인데 받아진건 또 34378이네요...--;왜 그럴까..메모리 릭???

출력되는 페이지가 chunked 인코딩은 아닌가요? HTTP 클라이언트로 받은 온전한 내용과 실제 소켓에서 받아보는 내용은 다를 수 있습니다.

--
익스펙토 페트로눔

acidd15의 이미지

아..그런가요?
암튼 멈추는 문제나얼른 해결 됐으면 좋겠네요..흡..

acidd15의 이미지

음...자세히 살펴보니 데이터는 모두 받아지지만 모두 받아진 직후에 멈추는것 같이 보이네요...--;아흐..

왜 그럴까?데이터를 모두 받았으면 데이터가 없는것으로 알고 읽기를 멈춰야 하는것이 아닌지?

--;소켓 데스크립터를 감시해서 문제가 생기면 종료하게 할수 없나?

으...lwp?????흑..

pynoos의 이미지

acidd15 wrote:
음...자세히 살펴보니 데이터는 모두 받아지지만 모두 받아진 직후에 멈추는것 같이 보이네요...--;아흐..

왜 그럴까?데이터를 모두 받았으면 데이터가 없는것으로 알고 읽기를 멈춰야 하는것이 아닌지?

--;소켓 데스크립터를 감시해서 문제가 생기면 종료하게 할수 없나?

으...lwp?????흑..

음.. 데이터가 없는 것으로 알고 읽기를 멈추라는 것은 참으로 고차원적인 얘기입니다. 소스는 데이터가 없는 것을 알고 멈추는 것이 아니라 소켓이 종료나 리셋에 의해 끊어질 때까지 기다리게 되어 있습니다.

위에 Reset이 났다는 것은 아마도 서버에서 타임아웃이 나서 끊은 것 같습니다.

처음에도 말했듯이, HTTP 1.0을 사용해서 테스트를 안하신듯합니다. 1.0은 정상적으로 데이터를 다 보내고 접속을 끊습니다.

익명 사용자의 이미지

아..저의 무지로 인해서 참 멍청한 짓을 한것 같네요..
pynoos님의 말이 맞았습니다.흑...정말 감사하구요..좀더 자세히 알아 봤으면 금방 끝냈을것을..호들갑만 떨어서 부끄럽네요.
결국은 http 프로토콜 헤더중에 Connection헤더의 필드값을 Keep-Alive가 아닌 close로 바꿔주니 정상적으로 되었답니다.--;근데 저는 단순시 Connection헤더 필드를 삭제 하고 했으니 안되었었던거였네요..혹시나 해서 찾아보니 필드값님 close가 있더라구요..
쩝..암턴 또 하나 귀중한 경험을 하게 되어 기쁩니다..도중에 포기했다면 이런 값진 경험을 못했겠죠?

댓글 달기

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