블로그 이미지
vee

카테고리

분류 전체보기 (17)
void (1)
Information (0)
Develop (5)
C/C++ (0)
Windows API (3)
TCP/IP (2)
Linux (3)
Hardware (3)
Operating system (5)
Total
Today
Yesterday

달력

« » 2026.7
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

최근에 올라온 글

서로 통신을 하려면 두 개의 소켓을 생성하여 자료를 송수신하게 된다.

이 때 두개의 소켓을 생성하는 가장 간단한 방법이 socketpair 함수를 사용하는 것이다.

socketpair 함수는 두 개의 소켓을 생성해주면서 자동으로 연결해주는 작업도 수행하기 때문에
개발자는 read와 write함수를 호출하여 자료를 송수신하면 된다.

 

int socketpair(int domain, int type, int protocol, int sd[2]);

domain – 사용할 프로토콜 패밀리
type – 해당 프로토콜에서 사용할 소켓의 유형
protocol – IPPROTO_TCP, IPPROTO_UDP, NULL 등의 프로토콜
sd[2] – sd[0], sd[1]

'Develop > TCP/IP' 카테고리의 다른 글

TCP/IP Socket programming  (0) 2013.09.06
Posted by vee
, |

 

응용프로그램에서 소켓을 생성하면 해당 소켓에 대한 포인터를 가지고 있는 기술자 테이블(Descriptor Table)의 색인(Index)를 얻게 되는데,
이것을 소켓 기술자(Socket Descriptor)라고 부른다. (Windows에서는 소켓 핸들)

응용프로그램에서 소켓을 생성할 때는 socket함수를 사용한다.

Visual C++에서의 socket 함수

SOCKET

WSAAPI

socket(

_In_ int af,

_In_ int type,

_In_ int protocol

);

af = Address Family (domain) – 사용할 프로토콜 패밀리
type – 프로토콜에서 사용할 소켓 유형
protocol – 사용할 프로토콜

return value

  • 지정한 유형의 소켓을 성공적으로 생성하면 소켓 기술자(소켓 핸들)을 반환한다.
  • 소켓을 성공적으로 생성하지 못하면 socket 함수는 -1을 반환한다.
  • typedef UINT_PTR SOCKET; (Winsock2.h)
  • typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

인자

비고

domain

PF_INET

IPv4 인터넷 프로토콜 패밀리

PF_INET6

IPv6인터넷 프로토콜 패밀리

PF_LOCAL

로컬 유닉스 소켓 프로그램 패밀리

PF_UNIX

로컬 유닉스 소켓 프로그램 패밀리

type

SOCK_STREAM

스트림 소켓

SOCK_DRAM

데이터그램 소켓

SOCK_RAW

Raw 소켓

SOCK_SEQPACKET

순차 패킷 소켓

protocol

IPPROTO_TCP

스트림 소켓

IPPROTO_UDP

데이터그램 소켓

 

socket은 사용한 후 더 이상 사용하지 않으면 소켓을 종료하고 자원을 반납해야 한다.
이 때 사용하는 함수가 close 함수이다. (Winsock에서는 closesocket)

int

WSAAPI

closesocket(

_In_ SOCKET s

);

SOCKET – 종료할 소켓

return value

  • 성공하면 0, 실패하면 -1

 

소켓 기술자 (소켓 핸들)을 이용하여 자료를 송신하고 수신할 수 있다.

리눅스에서는 read 함수를 이용하여 자료를 수신하며
Winsock에서는 recv 함수를 이용한다.

int read(int fd, void *buf, int count); - 리눅스

int

WSAAPI

recv(

_In_ SOCKET s,

_Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR * buf,

_In_ int len,

_In_ int flags

);

SOCKET s – 자료를 수신할 소켓 핸들
char FAR * buf – 수신한 자료를 저장할 버퍼의 주소 (포인터)
int len – 수신하는 자료의 최대 크기 (byte)
int flags – 옵션, NULL이면 리눅스 에서의 read 함수와 동일

return value

  • 성공 – 실제 수신한 자료의 크기 (byte)
  • 실패 – -1

 

리눅스에서는 write 함수를 이용하여 자료를 송신하며
Winsock에서는 send 함수를 이용한다.

int write(int fd, const void *buf, int count);

int

WSAAPI

send(

_In_ SOCKET s,

_In_reads_bytes_(len) const char FAR * buf,

_In_ int len,

_In_ int flags

);

SOCKET s – 자료를 송신할 소켓 핸들
const char FAR * buf – 전송할 자료를 저장하는 버퍼의 주소 (송신 버퍼)
int len – 전송할 자료의 최대 크기 (byte)
int flags – 옵션, NULL이면 리눅스 에서의 write와 동일

return value

  • 성공 – 실제 쓴 자료의 크기 (byte)
  • 실패 – -1
Posted by vee
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함