Я новичок в программировании сокетов, и я пытаюсь реализовать клиентский сервер с использованием 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;
}
}
Серверный код является пример программы обеспечивается Нр в их NonStop TCP/Руководство по программированию IP. Да, соединение принимается без ошибок. В первый раз я вызываю accept в первом сокете. Даже если я не создаю второй сокет, я столкнулся с той же проблемой, то есть сервер не отправляет ответ обратно, пока он работает, только когда сервер остановлен или сокет закрыт, сервер отправляет ответ. –
Bizarre. В отличие от любого другого API TCP, который я когда-либо видел почти через 30 лет. Вы читаете строки, но вы не пишете строки. – EJP