socket programming (BSD like)

Jirka Kosina jikos na jikos.cz
Středa Únor 6 10:08:38 CET 2002


On Tue, 5 Feb 2002, Richard Willmann, PC Revue wrote:

> > Takze pokud se chcete vyhnout zablokovani uvnitr read(), resp() write,
> > budete muset ten socket oznacit jako neblokujici.
> ano, selekt resp. poll povie ze da sa citat/pisat/vyskytla sa chyba. otazkou
> je, ze ci ak zavolam read() s bufferom velkosti 10KB sa mi vrati 1KB (to co
> uz je pripravene v kerneli) alebo to bude cakat na dalsich 9KB. Pri read() a
> write() je napisane, ze to moze vratit menej nez je velkost bufferu a preto
> treba citat dokola az kym to nevrati nulu ze EOF.

Jak uz psal Stano, je to implementacne zavisle, a na chovani se neda 
spolehat, nevim, ze by to stanovovala nejaka norma (ale mozna ano). 
Kazdopadne v linuxu se to chova tak, ze read() skutecne vrati to, co ma 
jadro ve fronte, a jako navratovou hodnotu dostanete kolik se toho 
skutecne nacetlo.
Takze ja ve svych programech pouzivam neco jako

int write_n(int fd,char *ptr, int count)
{
	int left, written;
	left=count;
	while(left > 0){
		written = write(fd,ptr,left);
		if(written <= 0)
			return(written);
		left -= written;
		ptr += written;
	}
	return(count - left);
}

S read() naprosto obdobne.

> Btw: nie je tam nejaky watermark? tusim som niekde videl, ze sa da nastavit
> velkost kerneloveho bufferu pre citanie/zapis.

No, to asi ve zdrojacich jadra, ze by tomu odpovidalo nejake sysctl nevim, 
ale je to klidne mozne.

-- 
JiKos.




Další informace o konferenci Linux