Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum reactivez Google Maps?

Conectare tableta X220la Tv

Femeile tinere nu mai vor sa munc...

La mulți ani @un_dac!
 La multi ani de Sfantul Gheorghe&...

Job - Facultate sau certificare

Deadpool & Wolverine (2023)

sistem hibrid eoliana + panouri +...
 Outlook e muta pe Android

Constructie Mun. Iasi. Casa P+1.

Cum mai rezolvati cu chiriasii ra...

Tastatura si mouse cu baterie int...
 AC Gree duce la palpait de becuri

Sfat / recomandare construire aco...

Cablu analog vs digital

Ce valoare stabiliti la RSSI la u...
 

cum folosesc/accesez un socket intr-un thread (C sub linux)

- - - - -
  • Please log in to reply
4 replies to this topic

#1
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
Problema serioasa:

un client se conecteaza prin socket de tip fisier la un server si ramane conectat
intr-un thread adorm client-ul ca sa nu consume resurse
in thread-ul copil, cand serverul ii trimite ceva, clientul se trezeste (teoretic ca la mine nu) si ii va semnala procesului tatic sa execute diverse.
ideea e ca select nu detecteaza nimic, desi stiu ca primesc informatii pe socket fiindca citesc date din el.
Pe scurt e posibil sa detectez ca am date in socket dintr-un proces copil al procesului in care s-a creat socketul?
Codul meu:

// procesul parinte:
void F_StartSocketReading()
{
pthread_t t;
	int rc;
	rc=pthread_create(&t,NULL,F_CheckSocketStatus,&sockfd);
	if(rc)
		return;
}
// functiile din thread-ul din "background"
void *F_CheckSocketStatus(void *arg)
{
	while(1)
	{
		if(socket_has_data(*((int*)arg)))
			fprintf(stderr,"\n socket has data\n");
		else
			fprintf(stderr,"\nno data in socket\n");
	}
}
static DM_Boolean socket_has_data(int fd)
{
	fd_set rfds;
	struct timeval tv;
	int retval;
	
	FD_ZERO(&rfds);
	FD_SET(fd,&rfds);
	tv.tv_sec=1;
	tv.tv_usec=0;
	[color="#FF0000"]retval=select(1,&rfds,NULL,NULL,NULL);[/color] [b] // asta inseamna ca asteapta pana ceva se intimpla in socket[/b]
	if (retval)
		return TRUE;
	return FALSE;
}

Edited by andreim77, 13 January 2011 - 14:16.


#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,235
  • Înscris: 24.02.2007
Pana la urma ai un thread sau un proces copil?

#3
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
thread, cum zice cod-ul, rezultat din pthread_create.
E posibil si cu fork, ideea e sa mearga algoritmul, adica select apelat in thread sa detecteze ca socket-ul are date la un moment dat, socket-ul fiind create in alt thread, cel al lui main.

#4
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
rezolvare :) se foloseste poll()

static DM_Boolean socket_has_data(int fd)
{
	struct pollfd pfd[1];
	int ret;
	
	pfd[0].fd=fd;
	pfd[0].events=POLLIN;
	ret=poll(pfd,1,-1);
	if(pfd[0].revents & POLLIN)
		return TRUE;
	return FALSE;
}

Functioneaza si pentru fork() si cu pthread_create()

#5
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
epoll() sub 2.6

Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate