메시지 큐에대해 질문 드립니다....

lhs8421478의 이미지

안녕하세요 C언어를 공부중인 사람입니다...

현재 메시지 큐를 이용해서 프로세스간 통신으로 리스트 검색을 하려고 합니다.

서버는 파일에서 data를 읽어 들여 링크드리스트를 구현해서 가지고 있고.

클라이언트는 검색할 방법과 검색할 단어를 입력해서 메시지큐 구조체를 서버로 전송합니다.

서버는 메시지큐를 읽어서 링크드 리스트를 검색하는것이지요...

현재 막힌부분은 서버가 메시지를 읽긴 하는데.. 꼭 한번은 건너 뛰고 읽고 있습니다...

처음 전송된 메시지큐는 읽지 못하고 두번째꺼는 읽어서 검색을 하고... 세번째꺼는 읽지 못하고 건너 뛰고

네번째는 읽어서 검색을 하고.. 이런식으로 진행이 되고 있습니다... 도무지 어디가 문제인지 몰라서 이렇게 글을 올립니다 ㅠㅠ

typedef struct _msg_buf {
	  int search_code;
  	char mtext[MAX_LENGTH];
}msg_buf_t;

메시지큐 구조체 입니다...

int msg_send(int msgq_id, msg_buf_t *msg)
{
	int len;
 
	if((len = strlen(msg->mtext)) > MAX_LENGTH){
		perror("req msg is too long");
		exit(1);
	}
 
	if (msgsnd(msgq_id, msg, len, 0) == -1) {
		perror("msg send failed.");
		return -1;
	}
	printf("len : %d \t msg_buf_t : %d\n", len, sizeof(msg_buf_t));
	return 0;
}

클라이언트에서 메시지를 보내는 부분입니다....

int msg_receive(int msgq_receive_id, msg_buf_t *msg, list_buf_t *head)
{
	int indentifier;
 
	indentifier = msgrcv(msgq_receive_id, msg, 
			MAX_LENGTH, 0, MSG_NOERROR);
	if (indentifier == -1){
		printf("메시지 큐 수신 실패");
		return -1;
	} 
 
	printf("\n---> search_code: %ld content: %s\n", 
			msg->search_code, msg->mtext);
 
	list_search(msg, head);
	return 1;
}

서버에서 메시지큐를 읽는 부분입니다...

왜 건너띄면서 읽는지 도무지 모르겠습니다 ㅠㅠ 도움 부탁 드립니다...

shint의 이미지

//
- MAX_LENGTH가 눈에 띄게 보입니다. 데이터 크기를 확인해보면 좋을거 같습니다.
 
- 이 코드를
if((len = strlen(msg->mtext)) > MAX_LENGTH)
{
}
 
- 이런식으로 바꾸는것이 좋아 보입니다. 또는 >= ... ㅡ_ㅡ;;
len = strlen(msg->mtext);
if(len > MAX_LENGTH)
{
}
 
- 요기서 len도 어떤지 확인 ㅇ_ㅇ;;
if (msgsnd(msgq_id, msg, len, 0) == -1)
{
}
 
 
int indentifier;
indentifier = msgrcv(msgq_receive_id, msg, MAX_LENGTH, 0, MSG_NOERROR);
MSG_NOERROR 옵션은 뭔가 잘라 낸다고 합니다. MAX_LENGTH 과 메시지 크기도 확인 필요.

http://blog.naver.com/nds239?Redirect=Log&logNo=10138526797


http://kldp.org/node/122901 이걸 보면... 버퍼 초기화'도 필요해 보이구요... 할것이 많네요. ㅇ_ㅇ;;

//
그리고. 이건 제 생각인데... msgrcv(버퍼);는 함수의 인자값보다는 임시로 변수를 생성해서 값을 얻는것이 좋아 보입니다.
msgrcv()로 읽는 것과 msg로 인자값을 받을때의 데이터 충돌 문제등을 고려해서... 라고... 소설을 써봅니다. ㅡ_ㅡ;;
 
int indentifier;
char buf[1024];
indentifier = msgrcv(msgq_receive_id, &buf, MAX_LENGTH, 0, MSG_NOERROR);
 
memcpy(msg, buf, sizeof(buf));
 
 
//
list_search(msg, head);
return 1;
 
함수 실행 이후의 리턴값 확인.등도 필요해 보입니다... ㅡ_ㅡ;;

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

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

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

lhs8421478의 이미지

우선은 구조체 텍스트 초기화는 memset이용해서 해주었고요...

사이즈를 그냥 sizeof(msg_buf_t)만큼으로 전송을 해주는걸로 바껐습니다...

근데도 역시나... 마창가지로 건너 뛰네요 ㅠㅠ 더 공부를 해봐야 할것 같습니다 ㅠㅠ

알려주신 내용을 토대로 좀더 공부를 해봐야 할것 같습니다 ㅠㅠ

shint의 이미지

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

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

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

sunyzero의 이미지

msgsnd를 할 때 2번째 인수인 msg에 메시지 타입은 항상 양수가 지정되어야 합니다.
위 코드만 보면 메시지 타입(search_code)에 아무 값도 지정하지 않는 것 같은데,
만일 양수가 아닌 경우라면 메시지 송신이 실패합니다.

========================================
* The truth will set you free.

lhs8421478의 이미지

양수의 값을 넣어 주고 있습니다....
크... 문제점을 열심히 알아보고 있습니다 ㅠㅠ

shint의 이미지

헛갈리네요.. 도통 뭐가 문제인지... ㅡ_ㅡ;;

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

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

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

익명 사용자의 이미지

서버측 수신받은 데이터 크기, 내용
클라측 송신한 데이터 크기, 내용 확인해보시고

일치하면... 로직상으로
서버측에서 잘못처리하는거같은뎅

아니면 큐버퍼가 다 차서 그럴수도있구여

댓글 달기

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