2016-10-23 8 views
1

Я новичок в программировании сокетов, и я пытаюсь реализовать клиентский сервер с использованием TCP. Клиент написан на Java в Windows, а сервер написан на C в Tandem/Hp-NonStop. Я могу подключить и отправить запрос на сервер.Tandem/Non-Stop Программирование сокетов

Но я не могу отправить ответ обратно клиенту с сервера во время его работы. Только когда я останавливаю сервер, он отправляет ответ клиенту.

Любой пример или пояснения или ссылки будут оценены.

Сервер работает в текущих вводах-выводах. Ниже приведен код моего сервера:

while (1) { 
/* Accept a connection on this socket. The accept call places the 
client's address in the sockaddr_in structure named clientaddr.*/ 
    clientaddrlen = sizeof(clientaddr); 
    if(accept_nw(s, (struct sockaddr *)&clientaddr, &clientaddrlen, tag) <0) { 
     perror("accept"); 
     exit(3); 
    } 
    if(fe = IOCheck(acceptWait)) { /* initially, wait -1; maybe change afterwards? */ 
     if(fe == 40) { 
      printf("Timed out after %ld secs wtg Client connect. Terminating.\n",acceptWait/100); 
      FILE_CLOSE_((short)s); 
      exit(0); 
     } else { 
      printf("AWAITIO error %d from accept_nw\n",fe); 
      exit(3); 
     } 
    } 
    /* Need a new socket for the data transfer 
    Resembles the earlier call */ 
    if ((new_s = socket_nw(AF_INET, SOCK_STREAM,0,2,0)) < 0) { 
     perror ("Socket 2 create failed."); 
     exit (4); 
    } 
    /* Make the connection */ 
    if (accept_nw2(new_s, (struct sockaddr *)&clientaddr, tag2) < 0) { 
     perror ("2nd Accept failed."); 
     exit (5); 
    } 
    if(fe = IOCheck(-1)) { 
     printf("AWAITIO error %d, tag %ld from 2nd 
     accept_nw\n",fe,tagBack); 
     exit(4); 
    } 
    /* Receive data from the client. 
    recv_nw() - awaitio() should be in a loop until a logical record 
    has been received. In this example, we expect the short messages 
    to be completed in a single recv_nw() */ 
    if(recv_nw(new_s, databuf, sizeof(databuf), 0, tag2) < 0) { 
     if(errno == ESHUTDOWN || errno == ETIMEDOUT || errno == ECONNRESET) { 
      FILE_CLOSE_((short)new_s); 
      continue; 
     } else { 
      perror("recv_nw error"); 
      exit(6); 
     } 
    } 
    if(fe = IOCheck(timeout)) { 
     if(fe == 40) { /* abandon and start over */ 
      FILE_CLOSE_((short)new_s); 
      continue; 
     } else { 
      printf("AWAITIO error %d from recv_nw\n",fe); 
      exit(6); 
     } 
    } 
    databuf[dcount] = '\0'; /* dcount set by IOCheck */ 
    /* Retrieve the client name using the address in the sockaddr_in 
    structure named clientaddr. A call to gethostbyaddr expects an 
    IPv4 address as input. */ 
    hp = gethostbyaddr((char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); 
    /* Convert the client's 32-bit IPv4 address to a dot-formatted 
    Internet address text string. A call to inet_ntoa expects an 
    IPv4 address as input. */ 
    ap = inet_ntoa(clientaddr.sin_addr); 
    port = ntohs(clientaddr.sin_port); 
    printf("Request received from"); 
    if (hp != NULL) printf(" %s", hp->h_name); 
    if (ap != NULL) printf(" (%s)", ap); 
    printf(" port %d\n\"%s\"\n", port, databuf); 
    /* Send a response to the client. */ 
    if (send_nw2(new_s, response, (int)strlen(response), 0, tag2) < 0) { 
     perror("send_nw2"); 
     FILE_CLOSE_((short)new_s); 
     continue; 
    } 
    if(fe = IOCheck(-1)) { 
     FILE_CLOSE_((short)new_s); 
     continue; 
    } 
} /* while */ 

Ниже представлен код моего клиента для отправки и получения запроса и ответа.

private String writeToAndReadFromSocket(Socket socket, String writeTo) throws Exception 
{ 
    try 
    { 
     // write text to the socket 
     BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     bufferedWriter.write(writeTo); 
     bufferedWriter.flush(); 

     // read text from the socket 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     StringBuilder sb = new StringBuilder(); 
     String str; 
     while ((str = bufferedReader.readLine()) != null) 
     {  
     sb.append(str + "\n"); 
     } 

     // close the reader, and return the results as a String 
     bufferedReader.close(); 
     return sb.toString(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 
} 

ответ

0

Ваш код на стороне сервера является полностью неправильным. Действительно ли оно принимает ошибки? Вам не нужно создавать второй сокет, и вы должны вызывать accept в первом сокете.

+0

Серверный код является пример программы обеспечивается Нр в их NonStop TCP/Руководство по программированию IP. Да, соединение принимается без ошибок. В первый раз я вызываю accept в первом сокете. Даже если я не создаю второй сокет, я столкнулся с той же проблемой, то есть сервер не отправляет ответ обратно, пока он работает, только когда сервер остановлен или сокет закрыт, сервер отправляет ответ. –

+0

Bizarre. В отличие от любого другого API TCP, который я когда-либо видел почти через 30 лет. Вы читаете строки, но вы не пишете строки. – EJP

0

Попробуйте отправить запрос с помощью утилиты Telnet, клиент вы используете, может быть буферизации данных, которые могли бы сделать это похоже сервер не отвечает ..