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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите разобратся с сокетами, sockets в linux 
:(
    Опции темы
koliyan
Дата 15.12.2003, 16:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Написанная программа выдает ошибку: Socket operation on non-socket
в функции recv();

/*-----------------simpleserver-------------------*/

/*Обозначения*/
/*-IM-информационное сообщение-*/
/*-EM-ошибка-*/

void childFunc(int client);
void childFunc(int client)
{
char buFFer[1024];
bzero(buFFer,sizeof(buFFer));
int numBytes=0;

numBytes = recv(client,buFFer,sizeof(buFFer),0);
if (numBytes>0)
cout << buFFer << endl;
else
{
perror("Nofing was send" );
}

int fd;
if ((fd=open(buFFer,O_WRONLY | O_CREAT,0666))<0)
{
send(client,"Create fail",sizeof(buFFer),0);
}else{
send(client,"Create success",sizeof(buFFer),0);
}

bzero(buFFer, sizeof(buFFer));
if (numBytes = read(client,buFFer,sizeof(buFFer)) <0)
{
perror("Read: ");
}else
{
write(fd,buFFer,sizeof(buFFer));
}

close(fd);
}

Помогите разобраться пожулуйста.
  Вверх
Ars
Дата 15.12.2003, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как ты получаешь client


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
koliyan
Дата 15.12.2003, 18:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ars

if( client = accept( sockDes, (struct sockaddr *) & clientAddr , sizeof(clientAddr)) < 0) /*ожидание подключения*/
perror("Accept");
- выдавало BAD ADRESS

и я переделал в

if( client = accept( sockDes, 0 , 0) /*ожидание подключения*/
perror("Accept");
  Вверх
Ars
Дата 15.12.2003, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я имею ввиду от socket (от создания сокета)


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
koliyan
Дата 15.12.2003, 19:13 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











int main(void)
{
int sockDes;
int numCon = 1;


cout << "Server start's!" << endl;
cout << "Getting socket descriptor...." << endl;

/*Создание сокета*/
if ((sockDes=socket(PF_INET,SOCK_STREAM,0/*protocol=0*/))<0)/*здесь происходит получение дескриптора сокета*/
{
perror("Socket()");
}else
{
cout << "Successfully get's socket descriptor." << endl;
}


/*Инициализация параметров для вызова функции bind() */
cout << "Initialization bind() parametrs...." << endl;
#define PORT 7000 /*задаем номер порта*/
struct sockaddr_in clientAddr;
bzero(&clientAddr, sizeof(clientAddr)); /*начальное обнуление структуры dest*/
clientAddr.sin_family = AF_INET; /*выбираем протокол AF_INET*/
clientAddr.sin_port = htons(PORT); /*выбираем наш порт PORT(5000)*/
clientAddr.sin_addr.s_addr=INADDR_ANY; /*любой IP адрес*/
cout << "Initialization succesed." << endl;



/*Привязка порта к сокету. Вызов функции bind()*/
cout << "Starting bind...." << endl; /*IM*/
if ( bind(sockDes, (struct sockaddr *) &clientAddr ,sizeof(clientAddr) ) !=0 ) /*привязываемся*/
{
cout << "!ERROR! code:" << errno << endl; /*EM*/

/*Обязательно закрываем socket*/
close(sockDes);

exit(errno);
}else
{
cout << "Bind success!" << endl; /*IM*/
}

/*Перевод сокета в режим прослушивания клиентских подключений*/
cout << "Start listen...." << endl;
if ( listen(sockDes,20) != 0)
{
cout << "!ERROR! code:" << errno << endl; /*EM*/

/*Обязательно закрываем socket*/
close(sockDes);

perror("Listen()");
}else
{
cout << "Listen success!" << endl; /*IM*/
}

/*Ожидание и принятие запросов на подключение с отображением каждого нового подключения на экране*/

pid_t pid = 1;
int client;
while(pid)
{
cout << "Waiting for connection " << numCon++ << "...." << endl;

if( client = accept( sockDes,(struct sockaddr *) & clientAddr , sizeof(clientAddr)) < 0) /*ожидание подключения*/
perror("Accept");
else{

cout << "Connected!" << endl; /*подключились*/
/*fork() создаст второй процесс-child он то и будет дальше разбираться*/
if ( fork() )
close(client); /*закрываем ненужный сокет*/
else
{
close(sockDes); /*закрываем ненужный сокет*/
childFunc(&client); /*почти весь код процесса child для удобства в одной функции*/
exit(0);
}

}

}



return EXIT_SUCCESS;
}
  Вверх
Ars
Дата 18.12.2003, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не совсем понял, что ты собрался делать в этом куске и зачем нужен процесс-child, но, по-видимому,
sockDes должен жить, пока ты используешь client
Код
/*fork() создаст второй процесс-child он то и будет дальше разбираться*/
if ( fork() )
close(client); /*закрываем ненужный сокет*/
else
{
close(sockDes); /*закрываем ненужный сокет*/  // Попробуй опустить эту строку под следующую
childFunc(&client); /*почти весь код процесса child для удобства в одной функции*/
exit(0);
}



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
Unregistered
Дата 23.12.2003, 19:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ars
Спасибо за помощь, я уже разобрался с этим. Программа работает как часы.
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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