Блокировка доступа в Socket-программировании - PullRequest
0 голосов
/ 21 ноября 2011

Я реализовал простой эхо-сервер с C ++ и g ++

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int PORT_NUM = 10000;

int echo_server()
{
  const int BUFSIZE = 10;
  struct sockaddr_in addr, cli_addr;
  bzero((char *) &addr, sizeof(addr));
  bzero((char *) &cli_addr, sizeof(cli_addr));
  socklen_t addr_len;
  char buf[BUFSIZE];
  int n_handle;

  int s_handle = socket (AF_INET, SOCK_STREAM, 0);
  if (s_handle == -1) return -1;

  // Set up the address information where the server listens
  addr.sin_family = AF_INET;
  addr.sin_port = htons(PORT_NUM);
  addr.sin_addr.s_addr = INADDR_ANY;

  if (bind(s_handle, (struct sockaddr *) &addr, sizeof(addr))== -1)
  {
   return -1;
  }

  if (listen(s_handle,SOMAXCONN) == -1)
  {
   return -1;
  }

  addr_len = sizeof(cli_addr);
  n_handle = accept(s_handle, (struct sockaddr *) &cli_addr, &addr_len);
  if (n_handle != -1)
  {
   int n;
   int m = 0;
   int c = 0;
     while ((n = read(n_handle, buf, sizeof buf )) > 0)
     {
       while (m < n)
         {
           c = write(n_handle, buf, n);
           cout << buf << "-" << c;
           m += c;
         }
     }
     close(n_handle);
   }

  return 0;
}


int main()
{
 cout << "TestServer";
 return echo_server();
}

Когда я запускаю приложение, cout в main подавляется из-за оператора accept в функции echo-сервера. Только после того, как я отправлю какой-нибудь текст и функция завершится, программа выдаст подсказку в основном.

Почему это? Это как-то связано с поведением блокировки функции доступа?

1 Ответ

2 голосов
/ 21 ноября 2011

Я предлагаю сброс вывод, как

cout << buf << "-" << c << endl;

или

cout << "TestServer" << flush;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...