The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Зависание listen"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Зависание listen" 
Сообщение от rad87 emailИскать по авторуВ закладки(ok) on 26-Сен-05, 22:41  (MSK)
Помогите пожалуйста!!!!!!!!!
Проблема такая! При запуске откомпелированной программы она зависает на listen(sServerListen,2)
Что делать я не знаю

#include<sys/socket.h>
#include <sys/types.h>
#include<string.h>
#include<netinet/in.h>
#include<netdb.h>
#include<memory.h>
#include<stdio.h>
#include<curses.h>
#include <arpa/inet.h>
#include<pthread.h>
#include<unistd.h>

pthread_t p_thread;
pthread_attr_t attr;

void * ClientThread(void *data)
{
int sock=(int)data;
char szSendBuff[1024],szRecvBuff[1024];
int ret;
printf(" Поток был успешно создан\n");
while(1)
    {
    ret=recv(sock,szRecvBuff,1024,0);
    if (ret=0) break;
    else if (ret == -1) {printf("Ошибка при получении данных в потоке\n"); break;}
    printf(szRecvBuff,"\n");
    strcpy(szSendBuff,szRecvBuff);
    if (ret=send(sock,szSendBuff,sizeof(szSendBuff),0)==-1) break;
}
    }

int main ()
    {
    int sServerListen,sClient;
    int sock,iSize;
    struct sockaddr_in localaddr,clientaddr;
    sServerListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
    if (sServerListen==-1)
{
printf("\Ошибка в создании соккета\n");
return(1);
}
    localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    localaddr.sin_family=AF_INET;
    localaddr.sin_port=htons(3010);
    if (bind(sServerListen,(struct sockaddr*)&localaddr,sizeof(localaddr))==-1)
{
close(sServerListen);
printf("Ошибка при привязке соккета к локальному адресу\n");
return(1);
}
    printf("\nПривязка к локальному адресу произошла успешно\n");
    if (listen(sServerListen,2)==-1) // ВОТ СДЕСЬ ОН И ЗАВИСАЕТ
        {
close(sServerListen);
printf("ошибка при прослушивание соккета\n");
        return(1);
        }
    printf("прослушивание порта началось");
    while (1)
{
        iSize=sizeof(clientaddr);
printf("цикл");
        if (sClient=accept(sServerListen,(struct sockaddr *) &clientaddr,(socklen_t *)&iSize)==-1)
         {
         close(sServerListen);
    printf("Ошибка при создантт дочернего сокета\n");
    return(1);
    }
else printf("дочерний процесс должен создаться");
        }
    void *s;
    s=&sClient;
    pthread_create(&p_thread,NULL,ClientThread,s);
    close(sServerListen);
    return 0;
    }


Задача программы принять сигнал,отобразить его на экране и отправить обратно

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Зависание listen" 
Сообщение от Rad87 Искать по авторуВ закладки on 27-Сен-05, 14:59  (MSK)
Да еще система Mandrake 10.2
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Зависание listen" 
Сообщение от Darknode Искать по авторуВ закладки on 27-Сен-05, 17:26  (MSK)
>Помогите пожалуйста!!!!!!!!!
>Проблема такая! При запуске откомпелированной программы она зависает на listen(sServerListen,2)
>Что делать я не знаю

попробуй для начала обнулить структуру localaddr, посмотри получится?

>
>#include<sys/socket.h>
>#include <sys/types.h>
>#include<string.h>
>#include<netinet/in.h>
>#include<netdb.h>
>#include<memory.h>
>#include<stdio.h>
>#include<curses.h>
>#include <arpa/inet.h>
>#include<pthread.h>
>#include<unistd.h>
>
>pthread_t p_thread;
>pthread_attr_t attr;
>
>
>
>void * ClientThread(void *data)
>{
>int sock=(int)data;
>char szSendBuff[1024],szRecvBuff[1024];
>int ret;
>printf(" Поток был успешно создан\n");
>while(1)
>    {
>    ret=recv(sock,szRecvBuff,1024,0);
>    if (ret=0) break;
>    else if (ret == -1) {printf("Ошибка при получении
>данных в потоке\n"); break;}
>    printf(szRecvBuff,"\n");
>    strcpy(szSendBuff,szRecvBuff);
>    if (ret=send(sock,szSendBuff,sizeof(szSendBuff),0)==-1) break;
> }
>    }
>
>int main ()
>    {
>    int sServerListen,sClient;
>    int sock,iSize;
>    struct sockaddr_in localaddr,clientaddr;
>    sServerListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
>    if (sServerListen==-1)
> {
> printf("\Ошибка в создании соккета\n");
> return(1);
> }

memset(&localaddr, (int)0, (size_t)sizeof(localaddr));

>    localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
>    localaddr.sin_family=AF_INET;
>    localaddr.sin_port=htons(3010);
>    if (bind(sServerListen,(struct sockaddr*)&localaddr,sizeof(localaddr))==-1)
> {
> close(sServerListen);
> printf("Ошибка при привязке соккета к локальному адресу\n");
> return(1);
> }
>    printf("\nПривязка к локальному адресу произошла успешно\n");
>    if (listen(sServerListen,2)==-1) // ВОТ СДЕСЬ ОН И ЗАВИСАЕТ
>
>        {
> close(sServerListen);
> printf("ошибка при прослушивание соккета\n");
>        return(1);
>        }
>    printf("прослушивание порта началось");
>    while (1)
> {
>        iSize=sizeof(clientaddr);
> printf("цикл");
>        if (sClient=accept(sServerListen,(struct sockaddr *)
>&clientaddr,(socklen_t *)&iSize)==-1)
>         {
>         close(sServerListen);
>     printf("Ошибка при создантт дочернего сокета\n");
>     return(1);
>     }
> else printf("дочерний процесс должен создаться");
>        }
>    void *s;
>    s=&sClient;
>    pthread_create(&p_thread,NULL,ClientThread,s);
>    close(sServerListen);
>    return 0;
>    }
>
>
>Задача программы принять сигнал,отобразить его на экране и отправить обратно


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Зависание listen" 
Сообщение от enot Искать по авторуВ закладки(??) on 27-Сен-05, 18:43  (MSK)
> sServerListen=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
Неверно, надо так:
sServerListen = socket(PF_INET, SOCK_STREAM, 0); // третий параметр = 0
Если уж придираться, то первый параметр PF_ а не AF_!!!

> localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
Неверно, надо так:
localaddr.sin_addr.s_addr = INADDR_ANY;
Сетевые константы из системных заголовков не надо преобразовывать к сетевому формату. (вообще INADDR_ANY = 0 - и все же ;-) )

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

и т.д.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Зависание listen" 
Сообщение от vnp emailИскать по авторуВ закладки(ok) on 27-Сен-05, 22:25  (MSK)
>Помогите пожалуйста!!!!!!!!!
>Проблема такая! При запуске откомпелированной программы она зависает на listen(sServerListen,2)
>Что делать я не знаю

Я тоже не знаю. У меня не зависла :(

PS: у вас там опечатка:

    ret=recv(sock,szRecvBuff,1024,0);
    if (ret=0) break;

Надо полагать, "ret == 0"

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Зависание listen" 
Сообщение от Rad87 Искать по авторуВ закладки on 28-Сен-05, 12:22  (MSK)
Большое спасибо за советы и подсказки я их все учел и исправил ошибки но помогло мне другое

printf("прослушивание порта началось");

сдесь в конце строки нет "\n" как только его поставил все заработало
Можно это я просто что-то не так понимаю, но поидее он должен был написатьстроку без перевода коретки на новую строку, а не зависать как в моем случае.

Пробовал тестить с помощью конструкции типа

for(i=1;i<10;i++)
{
printf("цикл");
}
зависает...
for(i=1;i<10;i++)
{
printf("цикл\n");
}
работает и выводит 10 раз цикл


Но теперь проблема в другом
Вот несколько модернезированный файл

#include<sys/socket.h>
#include <sys/types.h>
#include<string.h>
#include<netinet/in.h>
#include<netdb.h>
#include<memory.h>
#include<stdio.h>
#include<curses.h>
#include <arpa/inet.h>
#include<pthread.h>
#include<unistd.h>

pthread_t p_thread;
pthread_attr_t attr;

void * ClientThread(void *data)
{
int sock=(int)data;
char szSendBuff[1024],szRecvBuff[1024];
int ret;
printf("рПФПЛ ВЩМ ХУРЕЫОП УПЪДБО\n");
while(1)
    {
    ret=recv(sock,szRecvBuff,1024,0);
    if (ret==0) break;
    else if (ret == -1) {printf("пЫЙВЛБ РТЙ РПМХЮЕОЙЙ ДБООЩИ Ч РПФПЛЕ\n"); break;}
    printf(szRecvBuff,"\n");
    strcpy(szSendBuff,szRecvBuff);
    if (ret=send(sock,szSendBuff,sizeof(szSendBuff),0)==-1) break;
}
    }

int main ()
    {
    printf("оБЮБМП ТБВПФЩ РТПЗТБННЩ\n");
    int sServerListen,sClient;
    int sock,iSize;
    struct sockaddr_in localaddr,clientaddr; //УФТХЛФХТБ ДМС БДТЕУБ
//    struct hostent* h;
    sServerListen=socket(PF_INET,SOCK_STREAM,0);
    if (sServerListen==-1)
{
printf("пЫЙВЛБ Ч УПЪДБОЙЙ УПЛЛЕФБ\n");
return(1);
}
memset(&localaddr,(int)0,(size_t)sizeof(localaddr));
    localaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    localaddr.sin_family=AF_INET;
    localaddr.sin_port=htons(3010);
    if (bind(sServerListen,(struct sockaddr*)&localaddr,sizeof(localaddr))==-1)
{
close(sServerListen);
printf("пЫЙВЛБ РТЙ РТЙЧСЪЛЕ УПЛЛЕФБ Л МПЛБМШОПНХ БДТЕУХ\n");
return(1);
}
    printf("рТЙЧСЪЛБ Л МПЛБМШОПНХ БДТЕУХ РТПЙЪПЫМБ ХУРЕЫОП\n");
    if (listen(sServerListen,2)==-1)
        {
close(sServerListen);
printf("ПЫЙВЛБ РТЙ РТПУМХЫЙЧБОЙЕ УПЛЛЕФБ\n");
        return(1);
        }
    printf("РТПУМХЫЙЧБОЙЕ РПТФБ ОБЮБМПУШ\n");
    printf("оБЛПОЕГ-ФП\n");
    int i;
    
//    for (i=1;i<10;i++)
//    {
//     printf("ГЙЛМ\n");
//    }
    while(1)
{
printf("ГЙЛМ\n");
        iSize=sizeof(clientaddr);
printf("ГЙЛМ\n");
        if (sClient=accept(sServerListen,(struct sockaddr *) &clientaddr,(socklen_t *)&iSize)==-1)
         {
    printf("пЫЙВЛБ РТЙ УПЪДБОЙЙ ДПЮЕТОЕЗП УПЛЕФБ\n");
    
    }
    
printf("ДПЮЕТОЙК УПЛЕФ ДПМЦЕО УПЪДБФШУС");
int temp;
temp=pthread_create(&p_thread,NULL,ClientThread,&sClient);
printf("ДПЮЕТОЙК РТПГЕУУ ДПМЦЕО УПЪДБФШУС");


        }
   close(sServerListen);
    return 0;
    }


И теперь при компиляции выводит ошибку

/tmp/cc7tryST.o(.text+0*28f):in function 'main':
:undefined reference to 'pthread_create'
colelect2: ld returned 1 exit status

но при выводе  ниже следующего из бесконечного цикла ошибок при компиляции нет но и программа работает не так как надо :)
      int temp;
temp=pthread_create(&p_thread,NULL,ClientThread,&sClient);

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Зависание listen" 
Сообщение от Rad87 Искать по авторуВ закладки on 28-Сен-05, 12:39  (MSK)
А может еще и подскажете каким компилятором и какой версией лучше пользоваться
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Зависание listen" 
Сообщение от enot Искать по авторуВ закладки(??) on 28-Сен-05, 16:57  (MSK)
>printf("прослушивание порта началось");
>сдесь в конце строки нет "\n" как только его поставил все заработало

При использовании стандартной библиотеки следует помнить что вывод в stdout может быть построчно буферезированным. Т.е. пока \n не появится ничего и не будет выведено.
Либо setbuf(stdout, NULL); в начале программы
Либо fflush(stdout)); после каждого printf();

---------------------------------------
>void * ClientThread(void *data)
>{
....
>while(1)
>    {
>    ret=recv(sock,szRecvBuff,1024,0);
>    if (ret==0) break;
>    else if (ret == -1) {printf("пЫЙВЛБ РТЙ РПМХЮЕОЙЙ ДБООЩИ Ч РПФПЛЕ\n"); break;}

>    printf(szRecvBuff,"\n");

//szRecvBuff - это строка формата? (первый аргумент printf() - строка формата)
//Это куда печатаем? Если на консоль, то
//printf("%s\n", szRecvBuff);

>    strcpy(szSendBuff,szRecvBuff);
>    if (ret=send(sock,szSendBuff,sizeof(szSendBuff),0)==-1) break;
> }
> }

----------------------------------

>memset(&localaddr,(int)0,(size_t)sizeof(localaddr));

memset(&localaddr, 0, sizeof(localaddr));
// не надо загромождать код лишними преобразованиями,
// тем более это ведет к ошибкам

---------------------------------

>    localaddr.sin_addr.s_addr=htonl(INADDR_ANY);

localaddr.sin_addr.s_addr = INADDR_ANY;
// Здесь htonl не нужен.
// Сетевые константы аля INADDR_ANY всегда имеют правильный порядок байтов
---------------------------------

>И теперь при компиляции выводит ошибку
>/tmp/cc7tryST.o(.text+0*28f):in function 'main':
>:undefined reference to 'pthread_create'
>colelect2: ld returned 1 exit status

Это при компановке, нужно указать библиотеку -lpthread

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Зависание listen" 
Сообщение от enot Искать по авторуВ закладки(??) on 28-Сен-05, 17:00  (MSK)
Про компилятор: gcc 4.x.x или тот что есть ;-)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Зависание listen" 
Сообщение от rad87 Искать по авторуВ закладки(ok) on 28-Сен-05, 21:01  (MSK)
Большое спасибо всем кто помог мне в решении моих проблем,у меня все получилось.

Спа-си-бо!!! :)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру