Send를 할때 프로그램이 다운이 되버립니다.

lkjt의 이미지

Socket에서 다 정상적으로 연결되고 생성했습니다.

그런데 Send시에 다운이 되버리네요..

문자열이 그렇게 길지는 않습니다. 약 100개 정도 되보이내요..

bugiii의 이미지

write 시 SIGPIPE 일어나는 경우를 검색해보세요.

lkjt의 이미지

보낼때 Send로 보냈는데 Write랑 관계가 있나요...?

bugiii의 이미지

send 면 write 와 마찬가지 행태를 보인다고 알고 있습니다.

lkjt의 이미지

문제는 String클래스를 사용해서 그런거 같은데요...

Char recvbuf[1500] 으로 만든후 보내면 잘 보내집니다...
sprintf로 recvbuf에 쓰게 하면 또 에러나구요...

bugiii의 이미지

어궁...

string s( "어쩌구 저쩌구" );
//어찌어찌...
send( ..., s.c_str(), s.size() );

이런 형태로 쓰셨어요?

lkjt의 이미지

네, 그런데 어떤것은 되고 어떤것은 안되고 이러네요.

redcloak의 이미지

어떤 경우엔 되고, 안되고 한다면...
문자열관련한 에러는 문자열 끝의 널 값에 대한 처리때문에 문제가 생기는 경우가 많습니다. packet dump 해보셔서, 제대로 문자열이 들어갔는지와..
받는 쪽에서 문자열크기 및 널에 대한 처리를 제대로 하고 있는 지 확인해보세요.

* Art is long, life is short *

lkjt의 이미지

널값은 제대로 들어가 있내요...

그런데 string클래스에서 널값문제도 발생하나요?

dudungsil의 이미지

그동안 답변은 못해드렸지만, lkjt님의 질문을 많이봤습니다.

질문 패턴이 이렇더군요.
뭘했는데요, 안되네요. 뭐 걸랑요~

저 몇줄로 알아 낼 수 있는 건 거의 없다고 생각합니다. 과거 경험에 의한 짐작정도겠죠. 정확한 답변을 얻기 위해서는

1. 문제가 되는 부분의 소스를 제공해야 합니다. (전체 소스를 통째로 올리시는 분이 있는데, 이것도 좀 문제가 있다고 생각하네요. 두페이지가 넘어가는 소스가 올라와 있으면 저의 경우는 절대 안봅니다 -_-)
2. 더불어 정확 입력값과 형태, 정확한 출력값 그리고 API등의 리턴값을 기록해야합니다.
3. 추가적으로 작업 환경에 대한 설명 (OS, 컴파일러등)

등을 간략히 적어주셔야 합니다.

그리고 제가 기본적인 문법 떼고 처음 프로그램 만들때 도움이 됐던 방법을 적을께요. 스스로 문제를 해결하기 위한 방법인것 같습니다.

- 귀찮지만 모든 파라미터의 값을 점검합니다. assert를 적극 활용합니다.
- 모든 함수와 API의 리턴값을 반드시 확인합니다.
- warning을 error로 생각합니다.
- 코드를 가능한 쉽게 만들고, 복잡한 알고리즘등이 들어간 코드라면 그 코드를 테스트 할수 있는 코드를 만들어 몇억번 돌려봅니다.
- 새로 맞닥드리는 API는 하나씩 정리하고 파라미터와 결과값에 대한 내용을 외우다시피 확인해봅니다.
- 툴과 디버거 사용에 익숙해지기 위한 공부를 합니다. 컴파일러와 디버거의 세계도 정말 무궁무진 하죠.

기분나쁘게 듣지 않으셨으면 좋겠습니다.

산넘어 산

lkjt의 이미지

디버깅은 한줄식 디버깅했습니다.

왜 string클래스를 사용하면 블럭이 되버리는지 궁금하네요.

pynoos의 이미지

소스좀 한 번 봅시다..

bugii 님이 너무 친절한 나머지.. 다른 사람으로부터 피드백 받기는 힘들게 길들여(?)지는 것이 아닌지 모르겠군요.

lkjt의 이미지

m_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(m_sock == INVALID_SOCKET)
		return NULL;
	hptr = gethostbyname(Host.c_str());
	if(!hptr)
		return NULL;
	memcpy(&client.sin_addr, hptr->h_addr_list[0], hptr->h_length);
	client.sin_family = AF_INET;
	client.sin_port = htons(80);
	if(connect(m_sock, (sockaddr *)&client, sizeof(client)) == SOCKET_ERROR)
		return NULL;


	if(send(m_sock, ("GET " + Contents + " HTTP/1.0\r\n\r\n").data(), Contents.length(), 0) < 0)
		return NULL;
bugiii의 이미지

pynoos wrote:
소스좀 한 번 봅시다..

bugii 님이 너무 친절한 나머지.. 다른 사람으로부터 피드백 받기는 힘들게 길들여(?)지는 것이 아닌지 모르겠군요.

-_-; 매번 게시물의 답변과 거의 매일의 msn 대화에서도 항상 어떻게 질문해야 좋은 답변을 얻을 수 있는지 강조하고 있습니다. 절대 그냥 물고기를 주지 않습니닷!!! :twisted: (저... 무척 힘들게 노력하고 있습니다... 제 포스가 느껴지십니까?)

소스를 보니 문제가 바로 보이네요. 자... 생각해보세요. (비효율성은 둘째치더라도) "GET " + Contents + " HTTP어쩌구" 하면 이름 없는 임시변수가 생길테구요. 이 임시 string 변수에서 data() 멤버 함수를 불러서 합쳐진 문자열은 얻을 수 있을 것입니다. (다행히도 send 의 두번째 인자가 const void* 라 컴파일 에러는 면했군요.)

그런데, Contents.length() 는요? 그 앞뒤로 붙힌 문자열의 길이는 왜 같이 더하지 않죠?

보통 이런 경우는 명시적으로 다음과 같이 하는 것이 일반적입니다.

string Request( "GET " );
Request += Contents;
Request += " HTTP 어쩌구";

send( ..., Request.c_str(), Request.size(), ... )

왜냐구요? 왜 이렇게 빙 돌려서 구현하느냐구요? 왜 원래 것이 더 짧고 효율적이라고 보이지만 잘못된 코딩을 유발할 수 있는 위험한 방법이냐구요? 왜 두번째 제시한 것이 훨씬 효율적이고 (대부분의 프로그래머에게) 가독성이 높냐구요? 책을 보라고 정말 백번은 더 말씀드렸을텐데요?

이쪽 방면에서 성공하시려면 책을 잘 읽는 것 외에는 방법이 없습니다. 제발 구현은 당장 그만 두시고 책! 책! 책! 책을 읽으세요!!!

p.s. #1 몇번이고 반복해서 말씀드리지만, 책을 읽고 공부 열심히 하세요. 그리고, 책을 공부하는데 문제가 있거나 질문 사항이 있다면 언제든지 환영합니다.

p.s. #2 lkjt 님에게 적당하고 좋은 책은 pynoos 님이나 다른 분들이 이 글 밑에 주욱 달아주시리라 믿습니다. 특히 pynoos 님은 꼭 붙혀주실겁니다!!! :wink:

p.s. #3 유닉스 프로그래밍을 하겠다고 한다면 Linux든 FreeBSD든 네이티브 OS에서 코딩하고 테스트하셨으면 좋겠습니다. 지금과 같이 cygwin 인가 하는 것에서는 행동방식이 어떨지 바로 확인할 수 있는 분들도 드물고 거기서 바로 개발하는 경우보다는 그리로 포팅하는 경우가 많다고 봅니다. (지금 올리신 소스는 INVALID_SOCKET 등을 볼 때 win32용인 것 같습니다. 질문 사항에 OS, 컴파일러 등도 아주 중요한 요소 중에 하나입니다.)

pynoos의 이미지

제가 소스좀 보자고 한 것은, 말로 문제를 설명하면 문제가 50%도 전달안될텐데,
답을 말로 설명하면 또한 50%도 전달안되는 상황이 발생되어 문제에 대해 25%도 안되는 이해만 가지고 대화하게 되는 것이라
그런 소모는 하지 말자는 의미입니다. 오해없으시길...

한 줄의 코드는 그 사람의 평소 습관까지 그대로 보여줍니다. 만약 면접때 코드를 제출하라고 한다면,
정말 신경써서 제출해야합니다. 아주 세세한 것까지도 다 보이거든요. 잠재적인 문제까지도 그렇지요.

전.. 책보다는 질문할 때 두루뭉술하게 하지 않는 것이 답변을 받아내고자하는 사람의 전략임을 알려주고 싶습니다.
왜 답변안해주느냐고 원망하기 전에 답변을 유도할 만한 질문을 만드는 것이 세상 쉽게 사는 법이죠.
질문이 이상하면, 답을 해줄 수 있는 사람중 80%이상은 그냥 질문을 지나칩니다. 물론 저도 그 80% 같은 행동을 합니다.
그중 10% 도 안되는 사람이 추측성 답을 해주고, 10%는 집요(?)하게 다시 질문하라고 하지요..

bugiii의 이미지

집요... -_-;

lkjt의 이미지

그래도 다운이 되버립니다...

댓글 달기

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