alarm 질문질문 ^^:
void ActiveSinnal(void)
{
struct sigaction act;
act.sa_handler = ArarmConnect; //시그널에 대해 alarmHandler 실행되도록 설정
sigemptyset(&act.sa_mask); //빈시그널 집합 생성
act.sa_flags = 0; //시그널 처리 관련 옵션 flags
sigaction(SIGALRM, &act, NULL); //SIGALRM에 대한 act행동을 하도록 설정
}
void ArarmConnect(int signo)
{
close(fd_sock);
Connect(); //re connect
printf("ararm act! Re connect %d\n", signo); //14는 SIGALRM 을의미하는 시그널번호이다.
// exit(0);
}
// TCP Open한다.---------------------------------------------------------------------
int MakeSock(void)
{
if((fd_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0){ //서버 소켓생성
printf("Server: Can't open stream socket.");
return -1;
// exit(1);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(ServerIp);
return 1;
}
int Connect(void)
{
int fd_connect;
int rec = 0, res =0;
// int status;
// struct sigaction act;
//retry :
fd_connect = MakeSock();
/*
act.sa_handler = ArarmConnect; //시그널에 대해 alarmHandler 실행되도록 설정
sigemptyset(&act.sa_mask); //빈시그널 집합 생성
act.sa_flags = 0; //시그널 처리 관련 옵션 flags
sigaction(SIGALRM, &act, NULL); //SIGALRM에 대한 act행동을 하도록 설정
*/
ActiveSinnal(); //알람 실행 함수
//알람 3초 설정
while(fd_connect == 1){
signal(SIGALRM, ArarmConnect);
alarm(3);
if ((rec = connect(fd_sock, (const struct sockaddr *)&server_addr, sizeof(struct sockaddr))) == -1){
perror("connect failed(client)");
return -1;
}
/* if(rec == 1){ //정상 connect이면
alarm(0); //알람해제
return 1;
}
}*/
else { //정상 connect이면
// printf("fd_connect[%d]\n", rec);
alarm(0); //알람해제
return 1;
}
}
return 0; //리턴값없습
}
printf("child process[2] %ld\n", getpid());
int rec;
rec = Connect();
printf("while...rec 들어가기전.. %d\n",rec);
while(rec == 1 ){ //connect ok recurn 1 이면 send
printf("while/n");
TcpSend();
}
바로위 부분은 포크 생성 해서
메인에서 돌렸거든요.....
처음에 커넥이 되면.... 샌드 해서 데이터를 전송하는데...
처음에 서버가 접속이 안되면 리커넥하다가 서버 실행 하면 리커넥은 되거든요
근데 샌드쪽에서 데이터가 올라가지 않습니다....
샌드부분은 이렇습니다...
///////샌드부분
int TcpSend(void)
{
unsigned char temp[100] ={0, };
unsigned char temp2[20] = {0, };
long i;
char buf[17];
char parm_buf[100] ={0, };
char addr =0;
int res, index=0;
int ret =0;
memset(buf, 0, sizeof(buf));
memset(temp2, 0, sizeof(temp2));
sprintf(temp2, "%c01RPV1%c%d", STX, ETX, 0xff);
write( dev_scc4, temp2, 9 );
while (index < 13) {
ret = read(dev_scc4, buf + index, 1);
if (buf
else if (buf
index += ret;
}
printf("read data : %s\n", buf);
memset(temp, 0, sizeof(temp));
memcpy(temp, buf+7, 5);
temp[5] = '\0';
// while(1){
if((res = send(fd_sock, temp, strlen(temp), 0) == -1)){
perror("tcp send failed");
return -1;
// exit(1);
}
// }
printf("send data: [%s]\n", temp);
// sleep(3);
// return 0;
}
write()와 read()가 dev_scc4 에 대해서 수행중인데
write()와 read()가 dev_scc4 에 대해서 수행중인데
생성한 socket descriptor는 코드상에서 로칼변수 fd_connect 에
받으신 후 return을 안 하신 것 같네요.
dev_scc4 는 그럼 전역변수인 듯 하고, 0으로 초기화되어 있다면
write()와 read()를 표준입력에 대고 하신 건 아니신지 모르겠습니다.
키보드에서 Ctrl + V 친 상태에서 Ctrl + C 한번 쳐 보시기 바랍니다.
write()와 read() 문 리턴값도 확인해 보시고요.
while (index < 13) {
...
}
에 디버깅 코드 몇줄 넣어보세요. 아니면 디버거로 추적해 보시든지요.
송신전문 생성할 때도 %d 로 0xff 를 찍으면 아마 "255"가 되어서
전체 전문이 STX, "01RPV1", ETX, "255" 가 되고 길이가 11이 됩니다.
만일 상대방에서 9자까지만 입력을 받고 맨 마지막이 0xff인지 확인한다면
의도치 않은 상황이 발생할 수 있을 것 같기도 하고요.
아, 그리고 코드 올리실 때는
식으로
사이에 넣어주세요. 탭이나 공백이 살아있어서 들여쓰기가 유지됩니다.
댓글 달기