alarm 질문질문 ^^:

vilinux의 이미지

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

    == STX) index = 0;
    else if (buf
      == ETX) break;
      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 에 대해서 수행중인데
      생성한 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인지 확인한다면
      의도치 않은 상황이 발생할 수 있을 것 같기도 하고요.

      아, 그리고 코드 올리실 때는

          sock_fd = socket(...);
          if (sock_fd &lt; 0)
          ...

      식으로  
      사이에 넣어주세요. 탭이나 공백이 살아있어서 들여쓰기가 유지됩니다.

      댓글 달기

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