vsock(7) - wariua/manpages-ko GitHub Wiki
vsock - ๋ฆฌ๋ ์ค VSOCK ์ฃผ์ ํจ๋ฐ๋ฆฌ
#include <sys/socket.h>
#include <linux/vm_sockets.h>
stream_socket = socket(AF_VSOCK, SOCK_STREAM, 0);
datagram_socket = socket(AF_VSOCK, SOCK_DGRAM, 0);
VSOCK ์ฃผ์ ํจ๋ฐ๋ฆฌ๋ ๊ฐ์ ๋จธ์ ๊ณผ ๊ทธ ๋จธ์ ์ด ๋๋ ํธ์คํธ ๊ฐ์ ํต์ ์ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค. ๊ฐ์ ๋จธ์ ๋ง ๊ตฌ์ฑ๊ณผ ๋ ๋ฆฝ์ ์ธ ํต์ ์ฑ๋์ด ํ์ํ ๊ฒ์คํธ ์์ด์ ํธ์ ํ์ดํผ๋ฐ์ด์ ์๋น์ค์์ ์ด ์ฃผ์ ํจ๋ฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
์ ํจํ ์์ผ ํ์
์ SOCK_STREAM
๊ณผ SOCK_DGRAM
์ด๋ค. SOCK_STREAM
์ ์ ๋ฌ๊ณผ ์์ ์ ์ง๊ฐ ๋ณด์ฅ๋๋ ์ฐ๊ฒฐ ์งํฅ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ค. SOCK_DGRAM
์ ์ต์ ํ ์ ๋ฌ ๋ฐ ์ต์ ํ ์์ ์ ์ง ๋ฐฉ์์ ๋ฌด์ฐ๊ฒฐ ๋ฐ์ดํฐ๊ทธ๋จ ํจํท ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค. ์ด ์์ผ ํ์
๋ค์ ์ฌ์ฉํ ์ ์๋์ง ์ฌ๋ถ๋ ๊ธฐ๋ฐ ํ์ดํผ๋ฐ์ด์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ ์์ผ์ ๋ง๋ ๋ค.
socket(AF_VSOCK, socket_type, 0);
ํ๋ก์ธ์ค์์ ์ฐ๊ฒฐ์ ์๋ฆฝํ๊ณ ์ถ์ผ๋ฉด ์ด๋ค ๋ชฉ์ ์์ผ ์ฃผ์๋ก connect(2)
๋ฅผ ํธ์ถํ๋ค. ์์ผ์ด ํฌํธ์ ๊ฒฐ์๋์ด ์์ง ์์ผ๋ฉด ์๋์ผ๋ก ๋น ํฌํธ์ ๊ฒฐ์๋๋ค.
ํ๋ก์ธ์ค์์ bind(2)
๋ก ์์ผ ์ฃผ์์ ๊ฒฐ์ํ๊ณ ์ listen(2)
์ ํธ์ถํ์ฌ ๋ค์ด์ค๋ ์ฐ๊ฒฐ์ ๊ท๋ฅผ ๊ธฐ์ธ์ผ ์ ์๋ค.
send(2) ๋ด์ง write(2)
๊ณ์ด ์์คํ
ํธ์ถ์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ก์ ํ๊ณ recv(2) ๋ด์ง read(2)
๊ณ์ด ์์คํ
ํธ์ถ์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ค.
32๋นํธ ๋ฌธ๋งฅ ์๋ณ์(Context Identifier, CID)์ 32๋นํธ ํฌํธ ๋ฒํธ์ ์กฐํฉ์ผ๋ก ์์ผ ์ฃผ์๋ฅผ ์ ์ํ๋ค. CID๋ ์ถ๋ฐ์ง๋ ๋ชฉ์ ์ง๋ฅผ ๋ํ๋ด๋๋ฐ, ๊ฐ์ ๋จธ์ ์ด๋ ํธ์คํธ ์ค ํ์ชฝ์ด๋ค. ํฌํธ ๋ฒํธ๋ ๋์ผ ๋จธ์ ์์์ ๋๊ณ ์๋ ์ฌ๋ฌ ์๋น์ค๋ค์ ๊ตฌ๋ณํด ์ค๋ค.
struct sockaddr_vm {
sa_family_t svm_family /* ์ฃผ์ ํจ๋ฐ๋ฆฌ: AF_VSOCK */
unsigned short svm_reserved1;
unsigned int svm_port; /* ํฌํธ ๋ฒํธ, ํธ์คํธ ๋ฐ์ดํธ ์์ */
unsigned int svm_cid; /* ์ฃผ์, ํธ์คํธ ๋ฐ์ดํธ ์์ */
};
svm_family
๋ ํญ์ AF_VSOCK
์ผ๋ก ์ค์ ํ๋ค. svm_reserved1
์ ํญ์ 0์ผ๋ก ์ค์ ํ๋ค. svn_port
๋ ํฌํธ ๋ฒํธ๋ฅผ ํธ์คํธ ๋ฐ์ดํธ ์์๋ก ๋ด๋๋ค. 1024 ์๋์ ํฌํธ ๋ฒํธ๋ฅผ ํน๊ถ ํฌํธ๋ผ๊ณ ํ๋ค. CAP_NET_BIND_SERVICE
์ญ๋ฅ์ ๊ฐ์ง ํ๋ก์ธ์ค๋ง ๊ทธ ํฌํธ ๋ฒํธ์ bind(2)
ํ ์ ์๋ค.
ํน์ ์ฃผ์๋ค์ด ์ฌ๋ฌ ๊ฐ์ง ์๋ค. VMADDR_CID_ANY
(-1U)๋ ์๋ฌด ์ฃผ์์ ๊ฒฐ์ํ๋ผ๋ ๋ป์ด๋ค. VMADDR_CID_HYPERVISOR
(0)๋ ํ์ดํผ๋ฐ์ด์ ์ ๋ด์ฅ๋ ์๋น์ค๋ฅผ ์ํด ์์ฝ๋ ๊ฒ์ด๋ค. VMADDR_CID_RESERVED
(1)๋ ์ฌ์ฉํด์๋ ์ ๋๋ค. VMADDR_CID_HOST
(2)๋ ํธ์คํธ์ ์ ์๋ ค์ง ์ฃผ์์ด๋ค.
ํน์ ์์ VMADDR_PORT_ANY
(-1U)๋ ์๋ฌด ํฌํธ ๋ฒํธ์ ๊ฒฐ์ํ๋ผ๋ ๋ป์ด๋ค.
์์ผ์ด ๊ฐ์ ๋จธ์ ๋ผ์ด๋ธ ๋ง์ด๊ทธ๋ ์ด์
์ ์ํฅ์ ๋ฐ๋๋ค. ๊ฐ์ ๋จธ์ ์ด ์ ํธ์คํธ๋ก ์ด๋ํ ๋ ์ฐ๊ฒฐ๋์ด ์๋ SOCK_STREAM
์์ผ๋ค์ด ๋์ด์ง๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์์ฉ์์ ์ฌ์ฐ๊ฒฐ์ ํด์ผ ํ๋ค.
์ด์ CID๋ฅผ ์ ํธ์คํธ์์ ์ฌ์ฉํ ์ ์๋ค๋ฉด ๋ผ์ด๋ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฑฐ์น๋ฉด์ ๋ก์ปฌ CID๊ฐ ๋ฐ๋ ์๋ ์๋ค. ๊ฒฐ์๋ ์์ผ๋ค์ด ์๋์ผ๋ก ์ CID๋ก ๊ฐฑ์ ๋๋ค.
IOCTL_VM_SOCKETS_GET_LOCAL_CID
-
๋ก์ปฌ ๋จธ์ ์ CID๋ฅผ ์ป๋๋ค. ์ธ์๋
unsigned int
ํฌ์ธํฐ์ด๋ค.ioctl(socket, IOCTL_VM_SOCKETS_GET_LOCAL_CID, &cid);
๊ฒฐ์ ์
IOCTL_VM_SOCKETS_GET_LOCAL_CID
๋ก ๋ก์ปฌ CID๋ฅผ ์ป์ ํ์ ์์ดVMADDR_CID_ANY
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
EACCES
-
CAP_NET_BIND_SERVICE
์ญ๋ฅ์ด ์์ด์ ํน๊ถ ํฌํธ์ ๊ฒฐ์ํ ์ ์๋ค. EADDRINUSE
- ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ํฌํธ์ ๊ฒฐ์ํ ์ ์๋ค.
EADDRNOTAVAIL
- ๊ฒฐ์ํ ๋น ํฌํธ๋ฅผ ์ฐพ์ ์ ์๊ฑฐ๋ ๋ก์ปฌ ์๋ CID์ ๊ฒฐ์ํ ์ ์๋ค.
EINVAL
- ์ ํจํ์ง ์์ ๋งค๊ฐ๋ณ์. ์ด๋ฏธ ๊ฒฐ์๋ ์์ผ์ ๊ฒฐ์ํ๋ ค ํ ๊ฒฝ์ฐ, ์ ํจํ์ง ์์
sockaddr_vm
๊ตฌ์กฐ์ฒด๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ, ๊ธฐํ ์ ๋ ฅ ๊ฒ์ฆ ์ค๋ฅ. ENOPROTOOPT
-
setsockopt(2)
๋getsockopt(2)
์ ์ ํจํ์ง ์์ ์์ผ ์ต์ ์ฌ์ฉ. ENOTCONN
- ์ฐ๊ฒฐ ์ ๋ ์์ผ์ด์ด์ ๋์์ ์ํํ ์ ์์.
EOPNOTSUPP
- ๋์์ ์ง์ํ์ง ์์.
MSG_OOB
ํ๋๊ทธ๊ฐ send(2) ๊ณ์ด ์์คํ ํธ์ถ์ ๊ตฌํ๋์ด ์์ง ์๊ฑฐ๋MSG_PEEK
์ด recv(2) ๊ณ์ด ์์คํ ํธ์ถ์ ๊ตฌํ๋์ด ์์ง ์์. EPROTONOSUPPORT
- ์ ํจํ์ง ์์ ์์ผ ํ๋กํ ์ฝ ๋ฒํธ. ํ๋กํ ์ฝ์ด ํญ์ 0์ด์ด์ผ ํ๋ค.
ESOCKTNOSUPPORT
-
socket(2)์์ ์ง์ํ์ง ์๋ ์์ผ ํ์
.
SOCK_STREAM
๊ณผSOCK_DGRAM
๋ง ์ ํจํ๋ค.
๋ฆฌ๋ ์ค 3.9๋ถํฐ VMware(VMCI) ์ง์์ ์ด์ฉ ๊ฐ๋ฅํ๋ค. ๋ฆฌ๋ ์ค 4.8๋ถํฐ KVM(virtio)์ ์ง์ํ๋ค. ๋ฆฌ๋ ์ค 4.14๋ถํฐ Hyper-V๋ฅผ ์ง์ํ๋ค.
bind(2)
, connect(2)
, listen(2)
, recv(2), send(2), socket(2), capabilities(7)
2017-11-30