Невозможно понять системный вызов read () - PullRequest
0 голосов
/ 02 апреля 2010

Существует простая программа клиент-сервер.

  • Сервер запущен $. / Сервер 5000
  • Клиент также подключен к серверу .. $. / Client 127.0.0.1 5000
  • Клиент вводит строку
  • Клиент имеет сообщение «Я получил ваше сообщение», отображаемое на его терминале, а сервер отображает введенную строку клиентом

Проблема в том, что когда я запускаю клиент, выполняя $. / Client 127.0.0.1 5000. Я получаю это в терминале на стороне сервера.

Before Listen 
After Listen 
Before accept 
After accept 
Before read

Тогда только тогда, когда я ввожу сообщение на экране клиента и затем нажимаю ввод. Я получаю это отображается ..

Here is the message: This is a message

Почему , когда код входит в wait состояние перед вызовом read () просто ничего не читайте и возвращайте 0 ..

Я ошибаюсь где-то концептуально. Пожалуйста, помогите мне ..

Соответствующий код Клиента: -

if (connect(sockfd,&serv_addr,sizeof(serv_addr)) < 0) 
        error("ERROR connecting");
    printf("Please enter the message: ");
    bzero(buffer,256);
    fgets(buffer,255,stdin);
    n = write(sockfd,buffer,strlen(buffer));
    if (n < 0) 
        error("ERROR writing to socket");
    bzero(buffer,256);
    n = read(sockfd,buffer,255);
    printf("%d\n",n);
    if (n < 0) 
        error("ERROR reading from socket");
    printf("%s\n",buffer);

Соответствующий код сервера: -

if (bind(sockfd, (struct sockaddr *) &serv_addr,
                sizeof(serv_addr)) < 0) 
        error("ERROR on binding");
    printf("Before Listen ");
    listen(sockfd,5);
    printf("After Listen ");
    clilen = sizeof(cli_addr);
    printf("Before accept ");
    newsockfd = accept(sockfd, 
            (struct sockaddr *) &cli_addr, 
            &clilen);
    printf("After accept");
    if (newsockfd < 0) 
        error("ERROR on accept");
    bzero(buffer,256);
    printf("Before read");
    n = read(newsockfd,buffer,255);
    if (n < 0) error("ERROR reading from socket");
    printf("Here is the message: %s\n",buffer);
    n = write(newsockfd,"I got your message",18);
    if (n < 0) error("ERROR writing to socket");

Ответы [ 2 ]

4 голосов
/ 02 апреля 2010

По умолчанию сокеты создаются как блокирующие сокеты, и вызов чтения будет блокировать (ждать), пока есть данные для чтения.

0 голосов
/ 31 мая 2010

Если вы не хотите, чтобы чтение блокировалось, вы должны отключить режим BLOCKING.

int flags;

flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

Также обратите внимание, что read () и write () не гарантируют, что они вернут запрошенную вами сумму. Вот почему многие люди реализуют функции readall () или writeall ().

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