3

シリアルポートと tcp/ip ソケットの両方を同時に読み取るプログラムがあります。

ただし、ソケットを介してメッセージを受信した場合にのみ、シリアル情報を確認できます。accept() メソッドのブロック/非ブロックと関係があると思います。ただし、フラグを追加する方法がわかりませんでした。

誰にもアイデアはありますか?

全体を書き直す必要がありますか、それともフラグを追加するだけですか?

int main(int argc, char *argv[]) {
  int       list_s;                /*  listening socket          */
  int       conn_s;                /*  connection socket         */
  short int port;                  /*  port number               */
  struct    sockaddr_in servaddr;  /*  socket address structure  */
  char      buffer[MAX_LINE];      /*  character buffer          */
  char     *endptr;                /*  for strtol()              */


  /*  Get port number from the command line, and
   *        set to default port if no arguments were supplied  */

  if ( argc == 2 ) {
    port = strtol(argv[1], &endptr, 0);
    if ( *endptr ) {
      fprintf(stderr, "ECHOSERV: Invalid port number.\n");
      exit(EXIT_FAILURE);
    }
  }
  else if ( argc < 2 ) {
    port = ECHO_PORT;
  }
  else {
    fprintf(stderr, "ECHOSERV: Invalid arguments.\n");
    exit(EXIT_FAILURE);
  }


  /*  Create the listening socket  */

  if ( (list_s = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
    fprintf(stderr, "ECHOSERV: Error creating listening socket.\n");
    exit(EXIT_FAILURE);
  }


  /*  Set all bytes in socket address structure to
   *        zero, and fill in the relevant data members   */

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family      = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port        = htons(port);


  /*  Bind our socket addresss to the 
   *    listening socket, and call listen()  */

  if ( bind(list_s, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) {
    fprintf(stderr, "ECHOSERV: Error calling bind()\n");
    exit(EXIT_FAILURE);
  }

  if ( listen(list_s, LISTENQ) < 0 ) {
    fprintf(stderr, "ECHOSERV: Error calling listen()\n");
    exit(EXIT_FAILURE);
  }


  /*  Enter an infinite loop to respond
   *        to client requests and echo input  */
   int result = 0;
  int portID = -1;
  char *device = "/dev/ttyUSB1";
   int rate = convertRate("115200");
   char parity = convertParity("N");
   int databits = convertDatabits("8");
   int stopbits = convertStopbits("1");
  portID = posixComOpen(device,rate,parity,databits,stopbits);



  while ( 1 ) {

      char input = 0;

      while(posixComDataReady(portID) && posixComRead(portID, &input)) {
    printf("%c", input);
      } //while

      /* Write character to Vex */
     if(posixComWrite(portID, 'x') < 0)
       printf("POSIX: Error Writing char %c",'x');


    /*  Wait for a connection, then accept() it  */

    if ( (conn_s = accept(list_s, NULL, NULL) ) < 0 ) {
      fprintf(stderr, "ECHOSERV: Error calling accept()\n");
      exit(EXIT_FAILURE);
    }



    /*  Retrieve an input line from the connected socket
     *      then simply write it back to the same socket.     */
    Readline(conn_s, buffer, MAX_LINE-1);
    printf("Netbook got a TCP/IP message: %s\n", buffer);
    char* sendMessage = "Thanks for the message!";
    Writeline(conn_s,sendMessage , strlen(sendMessage));




    /*  Close the connected socket  */
    if ( close(conn_s) < 0 ) {
      fprintf(stderr, "ECHOSERV: Error calling close()\n");
      exit(EXIT_FAILURE);
    }



  }//while

  return 0;
}
4

1 に答える 1

0

そうです、問題はaccept、新しい接続があるまでブロックすることです。

シリアル接続がどのように機能するかはわかりませんが、selectいくつかの異なるファイル記述子を待機し、相手側にデータがある場合にそれらに応答できる機能を確認することをお勧めします。

ソケットに select を使用する方法の例を次に示します。サーバーの例

于 2012-11-28T03:41:15.197 に答える