Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с accept() 
:(
    Опции темы
A...
Дата 1.2.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 5.10.2004
Где: Ереван

Репутация: нет
Всего: 1



Привет всем!!!


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

Код

       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)


Зарание спасибо.
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
A...
Дата 2.2.2005, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 5.10.2004
Где: Ереван

Репутация: нет
Всего: 1



Проблемы больше нету, сделал так

Код

       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
--------------------
Особое спасибо Русскому языку за предоставленные буквы...
PM MAIL ICQ   Вверх
lp_sun
Дата 28.5.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



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

правильно я понимаю суть обмена???
PM MAIL   Вверх
Lazin
Дата 28.5.2008, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 1
Всего: 154



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

нет

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


Это сообщение отредактировал(а) Lazin - 28.5.2008, 13:40
PM MAIL Skype GTalk   Вверх
lp_sun
Дата 28.5.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



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

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

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

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

такая структура получается??? протокол TCP
PM MAIL   Вверх
Lazin
Дата 28.5.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 1
Всего: 154



клиент и сервер местами поменяй  smile 

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

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

как то так smile 
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.