LINUX.ORG.RU

accept срабатывает только после printf

 ,


0

2

Начал изучать сокеты беркли, до книг пока руки не дошли, начитался вики, linux.die.net и манов и написал, копируя куски из сети такой сервер(клиент тоже написал, но он интереса не представляет пока).

#include <sys/types.h>

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

int main()
{
    int client_socket, server_socket; // socket's descriptors for client and server
    struct sockaddr_in addr; // address of the server 
    char buf[1024]; // buffer for incomming message
    int bytes_read; // amount of bytes

    server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if(server_socket < 0)
    {
        perror("can not create socket");
        exit(1);
    }
    
    addr.sin_family = AF_INET; // address family - internet socket
    addr.sin_port = htons(5555);
    addr.sin_addr.s_addr = htonl(INADDR_ANY); // listen all local addresses
    if(bind(server_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("error on bind");
        exit(2);
    }
    
    if(listen(server_socket,1) != 0) // start listening
    {
        perror("can not start listening!\n");
        exit(3);
    }
    while(1)
    {
       //printf("inside while\n"); // злосчастрный printf
        int c;
        client_socket = accept(server_socket,0,0);
        while(1)
        {
            int bytes_read = recv(client_socket, buf, 1024, 0);
            if(bytes_read <= 0) break;
            printf("received %d bytes : %s", bytes_read,buf );
        }

    }

     return 0;
}

Если оставить printf, то сообщения вычитываются, иначе - нет. Если переменную создавать на месте printf, то не помогает. Идеи?

★★

Ответ на: комментарий от blokant

Проверь параметры сетевых функций и что возвращает accept - мож ошибка?

А вообще вот

vahtu
()

просто найди рабочий пример в сети

true_admin ★★★★★
()

Не вчитывался в код, но как там у тебя в этом месте с досбросом буферов? Попробуй их принудительно кидать т.к. \n вроде бы это и делает.

З.Ы. Если сильно наврал - тапки хотя бы мягие возьмите :)

aleks13
()
Ответ на: комментарий от blokant

По умолчанию на stdout построчная буферизация вывода

eXire ★★
()
Ответ на: комментарий от blokant

добавил \n во все printf и perror

Вот в perror \n добавлять не нужно, он сам его печатает :)

Хочу подробностей почему?

Выше уже объяснили, в man setvbuf все расписано.

Deleted
()
Ответ на: комментарий от Deleted

И еще, режет глаза, всё равно нужно завершающий ноль так

            int bytes_read = recv(client_socket, buf, 1024 - 1, 0);
            if(bytes_read <= 0) break;
            buf[bytes_read] = 0;
            printf("received %d bytes : %s\n", bytes_read,buf );
и сокет закрывать по выходе из внутреннего цикла.

oleg_2
()
Ответ на: комментарий от oleg_2

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

blokant ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.