메시지 큐와 소켓연관문제입니다...
글쓴이: shiny / 작성시간: 수, 2003/12/10 - 5:35오후
여기에서 큐로 메시지를 받은다음 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);
}
Forums:


ㅠ,.ㅠ 답변 부탁드려욥~~
ㅠ,.ㅠ;;
꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.
select 전에 FD_ZERO()과 FD_SET () 을해주어야
select 전에 FD_ZERO()과 FD_SET () 을
해주어야 하지 않을까요?
그래도 마찬가지입니다..ㅠ,.ㅠ
이것 저것 다 해봤는데..
간단한 문제는 아닌듯 싶어여..
꿈은 이루어진다.
그렇지 않다면 신이 우리에게 꿈을 꾸게 만들었을 리가 없다.
struct umsg 의 선언을 보여주시면 알기 쉽겟군요.
아마도 예상되는 것은 이것밖에 없군요.
struct umsg 구조체를 어떻게 잡으셨는지 함 보여주시기 바랍니다.
========================================
* The truth will set you free.
댓글 달기