메시지 큐와 소켓연관문제입니다...
글쓴이: 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.
댓글 달기