ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
Π Π°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ TLI ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ TPI. ΠΠ΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ TLI ΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π°ΠΌΠΈ TPI, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌΠΈ Π² ΡΠ°Π±Π». 6.10. Π‘Ρ Π΅ΠΌΠ° Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ TPI ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π°ΠΌΠΈ TPI ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π΄Π»Ρ ΡΠΈΠΏΠΈΡΠ½ΠΎΠ³ΠΎ TCP-ΡΠ΅Π°Π½ΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π½Π° ΡΠΈΡ. 6.32.
Π ΠΈΡ. 6.32. Π€ΡΠ½ΠΊΡΠΈΠΈ TLI ΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ TPI
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π±ΡΠ» ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ Π² Π³Π»Π°Π²Π΅ 5 ΠΏΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ STREAMS. ΠΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΌΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΡΠ²Π»ΡΡΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ putmsg(2) ΠΈ getmsg(2). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ TLI, ΡΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΡΠΈΠΊΠ»Π°Π΄Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΊ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌ, ΡΠ²Π»ΡΡΡΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΎΠΉ (ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, libnsl.so) Π±ΠΎΠ»Π΅Π΅ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΌ Π²ΡΠ·ΠΎΠ²Π°ΠΌ putmsg(2) ΠΈ getmsg(2).
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ t_connect(3N). ΠΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄:
int t_connect(int fd, struct t_call *sndcall,
struct t_call *recvcall) {
struct T_conn_req *connreq;
struct T_conn_con* conncon;
struct T_ok_ack *okack;
struct T_error_ack *errack;
struct strbuf connect, ack, confirm, m_data;
struct netbuf addr, opt, udata;
char *buf;
int flags;
...
/* Π‘ΠΎΡ ΡΠ°Π½ΠΈΠΌ Π°Π΄ΡΠ΅ΡΠ° Π±ΡΡΠ΅ΡΠΎΠ² netbuf Π·Π°ΠΏΡΠΎΡΠ° sndcall */
addr = sndcall->addr; opt = sndcall->opt;
udata = sndcall->udata;
/* ΠΠ°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ strbuf Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΡΠΏΡΠ°Π²Π»ΡΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ (Π±Π»ΠΎΠΊ M_PROTO) ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ T_CONN_REQ */
connect.len =
sizeof(struct T_conn_req) + addr.len + opt.len;
connect.maxlen =
sizeof(struct Π’_conn_req) + addr.maxlen + opt.maxlen;
buf = (char*)malloc(connect.maxlen);
connect.buf = buf;
/* ΠΠ°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π±Π»ΠΎΠΊΠ° M_PROTO ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ T_CONN_REQ Π²
ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ ΡΡΡΡΠΊΡΡΡΡ T_conn_req */
connreq = (struct T_conn_req*)buf;
connreq->PRIM_type = T_CONN_REQ;
connreq->DEST_length = addr.len;
connreq->DEST_offset = sizeof (struct T_conn_req);
buf += sizeof(struct T_conn_req);
memcpy(buf, addr.buf, addr.len);
connreq->OPT_length = opt.len;
connreq->OPT_offset = connreq->DEST_offset + opt.len;
buf += addr.len;
memcpy(buf, opt.buf, opt.len);
/* ΠΠ°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Ρ ΡΡΡΡΠΊΡΡΡΡ strbuf Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½ΡΡ
(Π±Π»ΠΎΠΊ M_DATA) */
m_data.len = udata.len;
m_data.maxlen = udata.maxlen;
m_data.buf = udata.buf;
/* ΠΡΠΏΡΠ°Π²ΠΈΠΌ Π·Π°ΠΏΡΠΎΡ Π’_CONN_REQ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΡ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΡ ΡΡΠ»ΡΠ³
ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΡ fd */
putmsg(fd, &connect, &m_data, 0);
/* ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠΌΡΡ ΠΊ ΠΏΡΠΈΠ΅ΠΌΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ. ΠΡΠ΄Π΅Π»ΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ
ΡΠ°Π·ΠΌΠ΅Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ
ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_ERROR_ACK Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΌΠ΅ΡΡΠ° */
ack.len = ack.maxlen = sizeof(struct T_error_ack);
ack.buf = udata.buf;
/* ΠΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΡΠ»Π°Π³
RS_HIPRI. ΠΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ Π½Π΅ ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ
Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ */
flags = RS_HIPRI;
getmsg(fd, &ack, (struct strbuf*)0, &flags);
free(connect.buf);
okack = (struct T_ok_ack*)ack.buf;
/* ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ
Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ */
if (okack->PRIM_type == T_OK_ACK) {
/* ΠΡΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅, ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΠΌΡΡ ΠΊ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ
ΡΠΎΠ³Π»Π°ΡΠΈΡ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ²ΡΠ·ΠΈ
(ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_CONN_CON) */
free(ack.buf);
if (recvcall != NULL) {
addr = recvcall->addr;
opt = recvcall->opt;
udata = recvcall->udata;
confirm.len = sizeof(struct T_conn_con) + addr.len + opt.len;
confirm.maxlen =
sizeof(struct T_conn_con) + addr.maxlen + opt.maxlen;
buf = (char*)malloc(confirm.maxlen);
confirm.buf = buf;
m_data.len = udata.len;
m_data.maxlen = udata.maxlen;
m_data.buf = udata.buf;
/* ΠΠΎΠ»ΡΡΠΈΠΌ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_CONN_CON */
getmsg(fd, &confirm, &m_data, &flags);
free(buf);
conncon = (struct T_conn_con*)confirm.buf;
if (conncon->PRIM_type == T_CONN_CON) {
/* ΠΡΠ»ΠΈ ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ³Π»Π°ΡΠΈΠ΅, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ
ΡΡΡΡΠΊΡΡΡΡ rcvcall Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ TLI */
addr.len = conncon->OPT_length;
opt.len = conncon->OPT_length;
memcpy(addr.buf, conncon+conncon->RES_offset, addr.len);
memcpy(opt.buf, conncon+conncon->OPT_offset, opt.len);
free(confirm.buf);
/* ΠΡΠ΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΎΡΡ ΡΠ΄Π°ΡΠ½ΠΎ β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ 0 */
return 0;
}
} else {
/* Π ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΊΠ°Π·Π° ΠΌΡ Π³ΠΎΡΠΎΠ²Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²
T_DISCON_IND */
...
return -1;
}
} else {
/* ΠΡΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_ERROR_ACK β ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Π΅Π³ΠΎ */
errack = (struct T_error_ack*)ack.buf;
...
return -1;
}
}
ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ TLI. ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° TCP ΠΏΡΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡΠΎΠΊΠ°, Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² ΡΠΈΠΏΠ° T_DATA_REQ ΠΈ T_DATA_IND. Π ΡΠΎ ΠΆΠ΅ Π²ΡΠ΅ΠΌΡ, Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΊΡΡΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ T_EXDATA_REQ ΠΈ T_EXDATA_IND. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° UDP Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ² T_UNITDATA_REQ ΠΈ T_UNITDATA_IND.
ΠΠΏΠΈΡΠ°Π½Π½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° TLI ΠΈΠΌΠ΅Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΠΊ β ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠΌΠΈ. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ t_connect(3N) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅ΡΠ²Π°Π½ΠΎ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ²ΡΠ·ΡΠ²Π°ΡΡΡΡ Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΌ ΡΠ·Π»ΠΎΠΌ. ΠΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Π·Π°Π΄Π°ΡΠΈ. ΠΡΠ»ΠΈ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ t_connect(3N) Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΠΈ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ, ΡΠΎ ΡΡΠ΄ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ°ΠΊΠΈΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΊ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ (t_bind(3N)), ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (t_open(3N), t_getinfo(3N)) ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° (t_optmgmt(3N)) Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Ρ ΠΎΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ΅Π»ΠΎΡΡΠ½ΠΎΡΡΠΈ Π΄Π°Π½Π½ΡΡ ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠ°ΡΡΠΊΠΎΠ² (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π° ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΡ ΡΡΠ»ΡΠ³) Π² ΡΠ΅ΠΆΠΈΠΌ ΡΠ΄ΡΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° STREAMS ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±ΠΌΠ΅Π½Π° ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ioctl(2).
ΠΠ΄Π½Π°ΠΊΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ioctl(2), ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ "ΠΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° STREAMS" Π³Π»Π°Π²Ρ 5, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° M_IOCTL. ΠΠ»Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ TPI ΡΠ»ΡΠΆΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ timod(7M), Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠΉ Π² ΠΏΠΎΡΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρ Π³ΠΎΠ»ΠΎΠ²Π½ΡΠΌ ΠΈ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ. ΠΠ° ΡΠΈΡ. 6.33 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΌΠ΅ΡΡΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ timod(7M) ΠΈ ΡΡ Π΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π ΠΈΡ. 6.33. ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΠΌ ΡΡΠ»ΡΠ³Π°ΠΌ
ΠΠ»Ρ Π²ΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ STREAMS, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ M_IOCTL, ΠΊΠΎΡΠΎΡΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ Π³ΠΎΠ»ΠΎΠ²Π½ΡΠΌ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ Π² ΠΎΡΠ²Π΅Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ioctl(fd, I_STR, ...), ΠΌΠΎΠ΄ΡΠ»Ρ timod(7M) ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌ, Ρ.Π΅. ΠΎΠ½ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π²Π½ΠΈΠ· ΠΏΠΎ ΠΏΠΎΡΠΎΠΊΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ M_IOCTL ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ TPI.
ΠΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ·ΠΎΠ² ioctl(2) ΠΈΠΌΠ΅Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΎΡΠΌΠ°Ρ:
#include <sys/stropts.h>
struct strioctl my_strioctl
...
strioctl.ic_cmd = cmd;
strioctl.ic_timeout = INFTIM;
strioctl.ic_len = size;
strioctl.ic_dp = (char*)buf;
ioctl(fd, I_STR, &my_strioctl);
ΠΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ioctl(2) ΠΏΠΎΠ»Π΅ size ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ°Π²Π½ΡΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π° TPI, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅ΠΌ cmd ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² Π±ΡΡΠ΅ΡΠ΅ buf. ΠΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΠ»Π΅ size ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΡΡ ΡΡΠ»ΡΠ³ ΠΈ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² Π±ΡΡΠ΅ΡΠ΅ buf.
ΠΠΎΠ΄ΡΠ»Ρ timod(7M) ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄ cmd:
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ cmd ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ timod(7M) TI_BIND ΠΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_BIND_REQ. ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl(2) Π² Π±ΡΡΠ΅ΡΠ΅ buf Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_BIND_ACK. TI_UNBIND ΠΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_UNBIND_REQ. ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl(2) Π² Π±ΡΡΠ΅ΡΠ΅ buf Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_OK_ACK. TI_GETINFO ΠΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_INFO_REQ. ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl(2) Π² Π±ΡΡΠ΅ΡΠ΅ buf Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_INFO_ACK. TI_OPTMGMT ΠΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_OPTMT_REQ. ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ioctl(2) Π² Π±ΡΡΠ΅ΡΠ΅ buf Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ² T_OPTMGMT_ACK.ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ DLPI