Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Проблема с accept()


Автор: A... 1.2.2005, 18:47
Привет всем!!!


Итак пишу следуйший код...

Код

       int sin_size;
       
        .............
        .............

       sin_size = sizeof(struct sockaddr_in);
       new_fd = accept(sockDescriptor, (struct sockaddr *)&their_addr, &sin_size);
       if(new_fd == -1){
               printf("Accept error: %s\n", new_fd);
               exit(1);
       }


Компилю...
Цитата

g++ FirstEdition.cpp -o FirstEdition


выдается ошибка

Цитата

FirstEdition.cpp: In function `int main()':
FirstEdition.cpp:52: error: invalid conversion from `int*' to `socklen_t*'


Вопрос почему...??? Везде написанно что третии параметр accept() может быть
Цитата
sizeof(struct sockaddr_in)


Зарание спасибо.

Автор: A... 2.2.2005, 15:38
Проблемы больше нету, сделал так

Код

       sin_size = sizeof(struct sockaddr_in);
       new_fd = accept(sockDescriptor, (struct sockaddr *)&their_addr, (socklen_t *) &sin_size);
       if(new_fd == -1){
               printf("Accept error: %s\n", new_fd);
               exit(1);
       }



Спасибо за внимание smile

Автор: lp_sun 28.5.2008, 13:10
народ такой вопрос:
есть сервер и клиент, нужно переслать несколько блоков инфы
как это прально сделать?
серверу:
нужно ли на каждый блок устанавливать соединение с помощью connect или токо один раз а потом посылать их функцией send(..) в цикле
клиенту:
я так понял на каждый блок нужно вызывать accept(sock,....) где sock - прослушивабщий сокет

правильно я понимаю суть обмена???

Автор: Lazin 28.5.2008, 13:35
Цитата(lp_sun @  28.5.2008,  13:10 Найти цитируемый пост)
правильно я понимаю суть обмена??? 

нет

Добавлено @ 13:38
accept - вызывается сервером для создания соединения (подключение клиента), дальше - в зависимости от того, что тебе нужно, либо сервер начинает писать в сокет а клиент читать это, либо наоборот. В общем это определяется протоколом, рвать соединения после каждой передачи не надо... 
Если позволяют религиозные убеждения, то лучше использовать библиотеку asio, она теперь входит в boost

Автор: lp_sun 28.5.2008, 14:33
если я правильно тебя понял то один раз создается слушающий сокет, потом он вызывает функцию accept, которая блокирует выполнение проги пока не поступит входящее соединение, вызванное из другого процесса функцией connect
т.е. получается шото типо такого:
сервер(отправляет):
Код

sock=socket(...);
.....
connect(sock....);
for(;;)
{
     write(sock,...);
}

клиент(принимает):
Код

sock=socket(...);
bind(...);
listen(...);
int client=accept(sock....);
for(;;)
{
        read(client,....);
}

такая структура получается??? протокол TCP

Автор: Lazin 28.5.2008, 15:17
клиент и сервер местами поменяй  smile 

сервер 
1. создает сокет и начинает слушать порт
2. в случае если в порт кто то постучался - создается еще один сокет - для обмена данными с клиентом (дальше сервер может перестать принимать соединения, до тех пор пока клиент не отконнектится, а может продолжить слушать, если поддерживается параллельная работа с несколькими клиентами)
3. читает данные
4 закрывает сокет

клиент
1. коннектится к серверу
2. если получилось (сервер "принял" подключение, создал сокет и ждет данные от клиента) отправляем данные
3. разрываем соединение

как то так smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)