메시지 큐와 소켓연관문제입니다...

shiny의 이미지

여기에서 큐로 메시지를 받은다음 UDP소켓으로 데이터를 전송하는데여..

전송한 다음 무한루프로 계속 반복되게 코딩했는데

꼭 한번실행한 다음 큐에서 정지합니다..

큐에 문제가 있다고 생각해서 소켓처리 부분을 생략하고 실행해 봤는데

아주 잘 동작하더라구여..

그리고 큐이전에 소켓을 써봤는데 다음으로 아예 넘어가질 않더군여...

소켓으론 데이터가 잘 넘겨지는데..

답답해 미치겠습니다..

어떻게 또 테스트를 해봐야는지.. 어찌 해결해야는지...

부탁드려여.....ㅠ,.ㅠ;; 감사합니다....꾸벅

코드올립니다..

main()
{
	FILE *ncfp;
	FILE *ddcfp;
	char ncNum[2];
	char scx_serial[5];
	char nc_pathfile[FILESIZE];
	char mrbuf[MAXDATASIZE];
	char send_buf[MAXDATASIZE];
	char sendto_buf[MAXDATASIZE];
	char scx_pathfile[FILESIZE];	
	struct umsg mymsg;
	
	int serverFd;	/* server socket */
	int serverLen;	/* address struct length */
	struct sockaddr_in serverINETAddress;	/* server INET address */
	struct sockaddr* serverSockAddrPtr;	/* server adress pointer */
	int qid;
	const int opt;
	char sso[]="song sun ok";

	struct timeval tv; /* select */
	fd_set writefds; /* select */
	
	ncNum[0]='0'; /* N.C serial number */
	ncNum[1]='\0'; /* N.C serial number */

	/* UDP socket create */
	if ((serverFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) 
	{
        	perror("socket");
         	exit(1);
	}
		
	serverLen = sizeof(struct sockaddr); /* struct length */	
	serverSockAddrPtr = (struct sockaddr *)&serverINETAddress;

	serverINETAddress.sin_family = AF_INET;      /* host byte order */
	serverINETAddress.sin_port = htons(UDPPORT);  /* short, network byte order */
	serverINETAddress.sin_addr.s_addr = inet_addr("192.168.0.192");
	bzero(&(serverINETAddress.sin_zero),8);
	
	printf("got connection from %s\n", inet_ntoa(serverINETAddress.sin_addr));
	
	/* qid creat */
	mymsg.mtype = (long)2;
	mymsg.mtext[0] = '\0';
	if((qid = msgget((key_t)2, IPC_CREAT | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) == -1)
	{
		printf("msgget err\n\r");
		quit("msgget", 2);
	}
	
	fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);
	if (fd < 0) {perror(MODEMDEVICE); exit(-1); }
	tcgetattr(fd, &oldtio);
	bzero(&newtio, sizeof(newtio));
	newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
	newtio.c_iflag = IGNPAR | ICRNL;
	newtio.c_oflag = 0;
	newtio.c_lflag = ICANON;
	tcflush(fd, TCIFLUSH);
	tcsetattr(fd, TCSANOW, &newtio);
	close(fd);
			
	while(1)
	{
		
			printf("큐로부터 데이터 수신..\n\r");
			if((qsize = msgrcv(qid, &mymsg, 4096, (long)2), IPC_NOWAIT) == -1) // IPC_NOWAIT MODE 
			{			
				printf("msgrcv err\n\r");
				sendto_buf[0] = NAK; // HMI에 보낼 NAK 신호 
				sendto_buf[1] = '\0';
				//quit("msgrcv", 3);
			}
			else
			{
				printf("recv OK\n\r");	
				printf("qsize->%d\n\r",qsize);
				mymsg.mtext[qsize]='\0';
				printf("mymsg.mtext->[%s]\n\r",mymsg.mtext);
		
				i=0;
				while(mymsg.mtext[i] != 4)
				{
					qbuf[i] = mymsg.mtext[i+1];
					i++;
				}
				//printf("i->%d\n\r",i);
				qbuf[i-3] = '\0';

				//printf("qbuf->%s\n\r",qbuf);
				sendto_buf[0] = '\0';
				strcpy(sendto_buf,&qbuf[0]); 
				size = strlen(sendto_buf);
				sendto_buf[size]='\0';
				printf("sendto_buf->%s\n\r",sendto_buf);
				
			}

			/* select */
			tv.tv_sec = 2;

			select(serverFd+1, NULL, &writefds, NULL, &tv);

			if(FD_ISSET(serverFd, &writefds))
			{
				// HMI에 전송 
				if ((numbytes=sendto(serverFd, sendto_buf, strlen(sendto_buf),0, serverSockAddrPtr, serverLen)) == -1) 
				{
	       		     		perror("sendto");
       			    		exit(1);
    				}	
				printf("sent %d bytes to %s\n",numbytes, inet_ntoa(serverINETAddress.sin_addr));
			}
			else 	
				printf("Timed out.\n\r");			
				printf("fclose(ncfp)\n\r");
		fclose(ncfp);
	} /* while(1) */
	printf("close(serverFd)\n\r");
	close(serverFd);
			
}

shiny의 이미지

ㅠ,.ㅠ;;

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

doseon의 이미지

select 전에 FD_ZERO()과 FD_SET () 을
해주어야 하지 않을까요?

shiny의 이미지

이것 저것 다 해봤는데..

간단한 문제는 아닌듯 싶어여..

꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.

sunyzero의 이미지

아마도 예상되는 것은 이것밖에 없군요.

struct umsg 구조체를 어떻게 잡으셨는지 함 보여주시기 바랍니다.

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

댓글 달기

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