* [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: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
* 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
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