ALT Linux Community general discussions
 help / color / mirror / Atom feed
* [Comm] read from socket
@ 2005-02-11  9:59 Nick S. Grechukh
  2005-02-11 10:35 ` Eugene Ostapets
  0 siblings, 1 reply; 5+ messages in thread
From: Nick S. Grechukh @ 2005-02-11  9:59 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 500 bytes --]

задача читать из сокета (PF_INET SOCK_STREAM) данные в количестве 'несколько' 
байт (команды вида 'stop','pause','skip','getinfo', возможно направляя ответ 
до 100 байт.
есть ли вероятность что команда будет прочитана не полностью (не успел ;-)
т.е., клиент делает write("getinfo\n"), а я при однократном чтении ловлю 
'geti' (при повторном чтении - остальное)
я так понимаю, это зависит от размера посылаемого пакета, и при десятках байт 
(которые влезают в один физический пакет) такое исключено? 

[-- Attachment #2: Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Comm] read from socket
  2005-02-11  9:59 [Comm] read from socket Nick S. Grechukh
@ 2005-02-11 10:35 ` Eugene Ostapets
  2005-02-11 10:43   ` Nick S. Grechukh
  2005-02-11 10:48   ` Nick S. Grechukh
  0 siblings, 2 replies; 5+ messages in thread
From: Eugene Ostapets @ 2005-02-11 10:35 UTC (permalink / raw)
  To: community

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Nick S. Grechukh wrote:
| задача читать из сокета (PF_INET SOCK_STREAM) данные в количестве
'несколько'
| байт (команды вида 'stop','pause','skip','getinfo', возможно направляя
ответ
| до 100 байт.
| есть ли вероятность что команда будет прочитана не полностью (не успел ;-)
| т.е., клиент делает write("getinfo\n"), а я при однократном чтении ловлю
| 'geti' (при повторном чтении - остальное)
| я так понимаю, это зависит от размера посылаемого пакета, и при
десятках байт
| (которые влезают в один физический пакет) такое исключено?

Нет, не исключено! Протокол tcp гарантирует что пакет будет доставлено,
если это возможно. udp гарантирует только отправку пакета. Больше никто
и ничего не гарантирует.

- --
С уважением,
Евгений Остапец
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQFCDIpTby6E0604xfQRAlQHAJ9yjs7FgyPwk9bCpWUkHmZ5bnzNWwCdHRjs
HTqdsDqSBkBFZQWIm7GnA0E=
=ZkLi
-----END PGP SIGNATURE-----


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Comm] read from socket
  2005-02-11 10:35 ` Eugene Ostapets
@ 2005-02-11 10:43   ` Nick S. Grechukh
  2005-02-11 12:41     ` Nick S. Grechukh
  2005-02-11 10:48   ` Nick S. Grechukh
  1 sibling, 1 reply; 5+ messages in thread
From: Nick S. Grechukh @ 2005-02-11 10:43 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 1079 bytes --]

On Friday 11 February 2005 12:35, Eugene Ostapets wrote:
> Nick S. Grechukh wrote:
> | задача читать из сокета (PF_INET SOCK_STREAM) данные в количестве
> 'несколько'
> | байт (команды вида 'stop','pause','skip','getinfo', возможно направляя
> ответ
> | до 100 байт.
> | есть ли вероятность что команда будет прочитана не полностью (не успел
> | ;-) т.е., клиент делает write("getinfo\n"), а я при однократном чтении
> | ловлю 'geti' (при повторном чтении - остальное)
> | я так понимаю, это зависит от размера посылаемого пакета, и при
> десятках байт
> | (которые влезают в один физический пакет) такое исключено?
> Нет, не исключено! Протокол tcp гарантирует что пакет будет доставлено,
ага. но 100 байт - по любому один пакет. меня пугает только не-атомарность, 
которая имхо может быть только в момент перемещения пакета с сетевого уровня 
в сам сокет.
> если это возможно. udp гарантирует только отправку пакета. Больше никто
> и ничего не гарантирует.
а recv с MSG_WAITALL не поможет? правда, тогда придется от текстовых команд 
уйти на бинарные ради фиксированной длины.

[-- Attachment #2: Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Comm] read from socket
  2005-02-11 10:35 ` Eugene Ostapets
  2005-02-11 10:43   ` Nick S. Grechukh
@ 2005-02-11 10:48   ` Nick S. Grechukh
  1 sibling, 0 replies; 5+ messages in thread
From: Nick S. Grechukh @ 2005-02-11 10:48 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 137 bytes --]

On Friday 11 February 2005 12:35, Eugene Ostapets wrote:
> Протокол tcp 
непринципиально, я изначально на PF_UNIX хотел делать. как там?

[-- Attachment #2: Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Comm] read from socket
  2005-02-11 10:43   ` Nick S. Grechukh
@ 2005-02-11 12:41     ` Nick S. Grechukh
  0 siblings, 0 replies; 5+ messages in thread
From: Nick S. Grechukh @ 2005-02-11 12:41 UTC (permalink / raw)
  To: community

[-- Attachment #1: Type: text/plain, Size: 997 bytes --]

вот что-то в этом роде получилось, поругайте:

typedef struct {
 char signature[8];
 int command;
 size_t msgsize;
} ctrl_header;

int operate(int sock, sq_command command, void * response, size_t len_buff)
{
 char *recvbuf;
 int n;
 ctrl_header hdr;
 memcpy(hdr.signature,"SQ1.0.00\n",10);
 hdr.command=1;
 hdr.msgsize=0;
 n = send(sock, &hdr, sizeof(hdr),0);
 n = recv(sock, &hdr, sizeof(hdr),MSG_WAITALL);
 if ((n==sizeof(hdr)) && (strncmp(hdr.signature,"SQ1.0.00\n",10)==0)){
  if (hdr.msgsize>0){
   if ((recvbuf=malloc(hdr.msgsize))!=NULL){
    if ((n = recv(sock,recvbuf, hdr.msgsize, MSG_WAITALL))==hdr.msgsize){
     if ((response!=NULL) && (len_buff>=0)) {
      memcpy(response,recvbuf,len_buff);
     }
    } else {
     //maybe socket error, count of received data<than promised
    }
    free(recvbuf);
   } else {
    // allocation error
   };
  }
 } else {
  // maybe again socket error, or there is no squash on that side...
 }
 return(1);
}

[-- Attachment #2: Type: application/pgp-signature, Size: 190 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2005-02-11 12:41 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-02-11  9:59 [Comm] read from socket Nick S. Grechukh
2005-02-11 10:35 ` Eugene Ostapets
2005-02-11 10:43   ` Nick S. Grechukh
2005-02-11 12:41     ` Nick S. Grechukh
2005-02-11 10:48   ` Nick S. Grechukh

ALT Linux Community general discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
		mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
	public-inbox-index community

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.community


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git