[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] lseek funktionaliitet på en socket.



Magnus Sjoegren wrote:
> IPC är bra nog när man inte behöver kommunicera med TCP/IP, men det är
> det jag vill (jag kanske var oklar).
Jeg forstår det absolut stadig ikke.

Hvis du vil læse fra en socket kan du checke med select() om der
er data der venter, på den måde undgår du at programmet står og
venter (crasher) i en read() fordi der aldrig kommer data.
(ref. nonblocking sockets)  Hvis select() returnere at der er data,
så kan du læse bare læse dem alle til en stor buffer.
 
> write(socket_fd, buffer, sizeof(buffer));
sizeof(buffer)? Hvis du taler med en tekst baseret protocol skal det
være strlen(buffer), men jeg regner ikke med at det har noget med
sagen at gøre.

> lseek(socket_fd, 0, SEEK_END);
Jeg ved ikke om man kan lave en lseek på en socket, men med et loop
af select's og read's kan du også flushe bufferen.

Problemet er jo at det kan være at serveren i den anden ende ikke
har fået sendt data før lseek kaldes, derfor kan der stadig være
data på socketen, når du kommer til den næste read. Du kunne lave
en sleep før lseek, og håbe på at det klarer problemet for det meste,
men på bekostning af ventetid, og problemet kan stadig opstå.

Det smarteste er nok at lave en protokol hvormed de to servere
kan snakke med hinanden, hvor det er klart fra protokollen hvem
der har ordet. Og du derfor kan flush socket data når du ved at
du har ordet. Dvs. du må wrappe dine binære data i blokke, og så
sende noget data før og efter blokkene, der fortæller om serveren
i den anden ende er færdig med at sende sine data, eller der 
kommer mere.

Hvad skal programmet kunne?
-- 
	Sometimes it's better to light a       Carsten Svaneborg
      flamethrower than curse the darkness.      sslug@sslug
	-- (Terry Pratchett, Men At Arms)    Fight Bill - use Linux


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:07 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *