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 用于套接字的示例:Server Example

于 2012-11-28T03:41:15.197 回答