LINUX.ORG.RU

[C][Socket] Потерял дескриптор (Нормальное форматирование)

 ,


0

0

Первый вопрос будет глупым, но я никак не могу сам понять.
Имеет ли смысл передавать в функцию не сокет а указатель на него, если в функции только чтение из сокета?

Второй вопрос.


Есть такая структура


typedef struct{
int socket; // сокет
char* cadr; //буфер для видео кадра
} video;

есть thread запускаемый pthread_create(thread, attr, get_video, &Cam1)
где Cam1 - это экземпляр video.

void *get_video( void *arg)
{
struct video *Camera = (struct video*) arg;
printf(" socket descriptor: %d\n", Camera->socket);


перед созданием потока дескриптор равен 4, в потоке он почему-то ноль.
Но бывает еще веселее - дескриптор в потоке равен 4, но после первого recv становится равен нулю...

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

Где я мог пропустить подводный камень?

Возможно, ты делаешь так:

void run()
{
  video Cam1 = ...
  pthread_create(thread, attr, get_video, &Cam1);
}

? Как создается Cam1?

unsigned ★★★★
()

>Но бывает еще веселее - дескриптор в потоке равен 4, но после первого recv становится равен нулю..

recv затирает память? Если сокет как раз до recv 4, а сразу после recv = 0, то проверь буфер и его длину в recv.

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

Буфер создавался через calloc, сделал структуру через malloc все ок.

Спасибо :)

А вот на первый вопрос никто не ответил =\

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

Нет, не имеет, потому что socket() возвращает int, 4байта, а указатель может быть 8байт на 64 битной системе.

frey ★★
()

x86_64 - под стек выделится 8 байт в случае ука-ля и 4 байта в обратном случае. Имеет ли это смысл - однозначно нет.

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

получится указатель на структуру из указателей? зачем такие сложности?!
более того, можно сделать буфер внутри структуры:

typedef struct{
int socket; // сокет
char cadr[]; //буфер для видео кадра
} video;
...
video *Cam1 = (video*) malloc(sizeof(video) + cadr_length);

Но это «не очень хороший код»...


Кстати, когда описываете структуру через typedef:
typedef struct{
...
} video;
при объявлении экземпляра слово struct можно не указывать.

Если делаете так:
struct video{
...
};
то отрывать struct и video друг от друга далее в программе нельзя.

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

спасибо, этого я не знал.

Но я лучше укажу прямо, что это структура самому потом будет проще.

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