- 네트워크 연결 또는 유닉스 프로세스간 통신(IPC : InterProcess? Communication) 파이프와 같은 특정 통신 영역
스트림 또는 데이터그램과 같은 특정 통신 타입
TCP 또는 UDP 와 같은 특정 프로토콜
유닉스 기반 소켓
int socket(int domain, int type, int protocol)domain값 | 설명 |
PF_UNIX | 유닉스 IPC통신 |
PF_NET | IPv4 인터넷 프로토콜 |
PF_INET6 | IPv6 인터넷 프로토콜 |
PF_IPX | Novell 프로토콜 |
PF_NETLINK | 커널 사용자 인터페이스 드라이버 |
PF_X25 | ITU-T X.25/ISO-8208 프로토콜 |
PF_AX25 | 아마추어 라디오 AX.25 프로토콜 |
PF_ATMPVC | 처리되지 않은(raw) ATM PVC에 대한 접근 |
PF_APPLETTALK | AppleTalk? 프로토콜 |
PF_PACKET | 로우 레벨 패킷 인터페이스 |
type값 | 설명 |
SOCK_STREAM | 연결 지향 통신 패킷을 사용 |
SOCK_DGRAM | 비연결 통신 패킷을 사용 |
SOCK_SEQPACKET | 최고 길이가 정해진 연결 지향 통신 |
SOCK_RAW | 처리되지 않은(raw) IP 패킷을 사용 |
SOCK_RDM | 패킷 정렬이 보장되지 않지만 신뢰성이 있는 데이터그램 계층을 사용 |
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
s : 소켓
level : 수정할 레벨 (소켓 레벨 : SOL_SOCKET, IP 레벨 : IPPROTO_IP, TCP 레벨 : IPPROT_TCP)
optname : 소켓 옵션 이름
optval : 옵션 수정에 대한 값
optlen : 옵션 수정에 대한 길이
struct sockaddr_in{
-
short sin_family; // 주소 유형
unsigned short sin_port; // 포트
struct in_addr sin_addr; // 4바이트 형태의 IP 주소
char sin_zero[8]; // 패딩에 사용되는 8바이트
int bind(int socket, sockaddr *addr, int length);
int listen(int socket, int backlog);
int accept(int socket, sockaddr *from, int *fromlen);
int send(int socket, const void *message, int length, int flags);
int recv(int socket, void *message, int length, int flags);
int connect(int socket, sockaddr *addr, int addrlen);
int shutdown(int socket, int how);
int close(int socket);
int sendto(int socket, char *message, int length, int flags, sockaddr *dest, int destlength);
int recvfrom(int socket, char *message, int length, int flags, sockaddr *from, int fromlength);
int fcntl(int fd, int cmd, int arg);
int select(int numfd, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
readfds : 읽어들일 데이터가 준비된 상태의 소켓
writefds : 쓰기 준비가 된 상태의 소켓
exceptfds : 예외 상황이 발생한 소켓
FD_ZERO(set) // 멀티 플렉스 셋을 초기화
FD_SET(socket, set) // 멀티 플렉스 셋에 socket를 추가
FD_CLR(socket, set); // 멀티 플렉스 셋에 socket를 제거
FD_ISSET(socket, set); // 멀티 플렉스 셋에 socket의 포함 여부 테스트
윈도우 기반 소켓
Winsock 라이브러리윈도우즈 95 워크스테이션고 함께 발표된 Winsock 라이브러리 1.1과
원도우즈 98 이후 발표된 2.2로 완성되었다.
Windows CE는 아직 Winsock 1.1 버전만을 지원한다.
int WSAStartup(WORD wVersion, LPWSDATA lpWSAData);
wVersion : MAKEWORD(2,2);
lpWSAData : 성공시 WSADATA에 시스템 관련 정보를 반환받는다.
int WSACleanup(void);
int ioctlsocket (SOCKET s, long cmd,u_long FAR* argp);
int WSAAsyncSelect?(SOCKET s, HWND hwnd, unsigned int uMsg, long lEvent);
윈도우즈 프로그램은 이벤트를 사용할 수 있다.
s : 모니터링할 소켓
hwnd : 이벤트 메시지를 수집할 부모창
uMsg : 전송할 실제 이벤트
lEvent : 모니터링할 이벤트
이벤트 | 설명 |
FD_ACCEPT | 소켓에 새로운 연결이 확립되었다. |
FD_ADDRESS_LIST_CHANGE | 소켓의 프로토콜 유형에 대한 로컬 주소 리스트가 수정되었다. |
FD_CLOSE | 기존의 연결이 종료 되었다. |
FD_CONNECT | 소켓이 원격 호스트와 연결을 확립했다. |
FD_GROUP_QOS | 소켓의 유형이 QoS 값이 수정되었다. |
FD_OOB | 소켓에서 대역 외(out-of-band) 데이터를 수집하였다. |
FD_QOS | 소켓의 QoS 값이 수정되었다. |
FD_READ | 소켓에 있는 데이터를 읽어들일 준비가 되었다. |
FD_ROUTING_INTERFACE_CHANGE | 소켓의 라우팅 인터페이스가 특정 목적에 대해서 수정되었다. |
FD_WRITE | 소켓이 데이터를 출력할 준비가 되었다. |
int WSAEventSelect?(SOCKET s, WSAEVENT hEvent, long lNetworkEvents?);
s : 모니터링할 소켓
hEvent : 소켓 이벤트가 발생할 때 생성될 이벤트. WSACreateEvent?()로 생성. Win32환경의 시스템 객체이다.
lNetworkEvents? : 모니터링할 모든 소켓 이벤트의 비트와이즈 조합
C# 소켓
IPAddress
메소드 | 설명 |
HostToNetwork?IOrder | IP주소를 호스트 바이트오더에서 네트워크 바이트오더로 바꾼다 |
NetworkToHostOrder? | IP주소를 네트워크 바이트오더에서 호스트 바이트옫로 바꾼다. |
IsLoopBack? | IP주소가 루프백인지 검사한다. |
필드 | 설명 |
Any | 로컬 시스템에서 사용할 수 있는 IP주소를 나타냄. 0.0.0.0 |
BroadCast? | 로컬 네트워크의 IP브로드캐스트 주소를 나타내는데 사용 |
LoopBack? | 시스템의 루프백 주소를 나타내는데 사용 |
None | 시스템에 네트워크 인터페이스가 없음을 나타내는데 사용. 더미소켓. 255.255.255.255 |
IPEndPoint?
메소드 | 설명 |
Create | SocketAddress? 객체로부터 EndPoint?객체를 생성한다. |
Serialize | IPendPoint?인스턴스에 대한 SocketAddress? 인스턴스를 생성한다. |
이 클래스는 IPEndPoint? 인스턴스를 저장해두었다가 IPEndPoint?.Create()메소드로 다시 생성할 수 있다.
SocketAddress? 클래스의 형태는 다음과 같다.
1바이트로 나타내는 객체의 AddressFamily?
1바이트로 나타내는 객체의 크기
2바이트로 나타내는 객체의 포트 번호
나머지 바이트는 객체의 IP주소를 나타낸다.
필드 | 설명 |
Address | IP주소속성을 가져오거나 설정한다. |
AddressFamily? | IP주소 유형을 가져온다. |
Port | TCP/UDP 포트번호를 가져오거나 설정한다. |
MaxPort? | 사용 가능한 포트번호의 최대값 |
MinPort? | 사용 가능한 포트번호의 최소값 |
Socket
public Socket(AddressFamily? af, SocketType? st, ProtocolType? pt);af : 네트워크 유형을 정함. 일반 네트워크 IP통신에는 AddressFamily?.Internetwork값을 사용해야한다.
st : 데이터 연결을 정의. SocketType?.Stream, SocketType?.Dgram, SocketType?.Raw
pt : 특정 네트워크 프로토콜을 정의. SocketType?에 종속적. Dgram은 UDP, Stream은 TCP, Raw는 Raw, ICMP등이 있다.
필드 | 설명 |
AddressFamily? | Socket의 주소 유형을 조사 |
SocketType? | Socket의 타입을 조사 |
ProtocolType? | Socket의 프로토콜 타입을 조사 |
Available | 읽을 준비가 된 데이터를 조사 |
Blocking | Socket의 블로킹 상태를 설정하거나 조사 |
Connected | Socket이 원격장치에 연결되었는지 여부를 나타내는 값을 조사 |
Handle | Socket의 운영체제 핸들을 조사 |
LocalEndPoint? | Socket의 로컬 EndPoint?를 조사 |
RemoteEndPoint? | Socket의 EndPoint?정보를 조사 |
public void SetSocketOption?(SocketOptionLevel? optionLevel, SocketOptionName? optionName, byte[] optionValue);
public void SetSocketOption?(SocketOptionLevel? optionLevel, SocketOptionName? optionName, int optionValue);
public void SetSocketOption?(SocketOptionLevel? optionLevel, SocketOptionName? optionName, object optionValue);
SocketOptionLevel?
값 | 설명 |
IP | IP 소켓 옵션 |
Socket | Socket 옵션 |
Tcp | TCP 소켓 옵션 |
Udp | UDP 소켓 옵션 |
SocketOptionName?
값 | SocketOptionLevel? | 설명 |
AcceptConnection? | Socket | true일 경우, 소켓은 대기(listen)상태 |
AddMembership? | IP | IP 그룹 멤버쉽을 추가한다. |
AddSourceMembership? | IP | 소스 그룹에 포함 |
BlockSource? | IP | 소스로부터 데이터를 블록 |
BroadCast? | Socket | true일 경우, 브로드 캐스트 메시지 전송을 허가 |
BsdUrgent? | IP | 긴급한 데이터를 사용(한번만 설정할 수 있으며, 해제가 불가능하다.) |
ChecksumCoverage? | Udp | UDP체크섬 범위를 설정하거나 조사 |
Debug | Socket | true일 경우, 디버깅 정보를 기록 |
DontFragment? | IP | IP 패킷을 분할하지 않음 |
DontLinger? | Socket | 데이터를 더 이상 대기하지 않고 소켓을 닫음 |
DontRoute? | Socket | 패킷을 인터페이스 주소로 바로 전송 |
DropMembership? | IP | IP 그룹 멤버쉽을 취소 |
DropSourceMembership? | IP | 소스 구룹을 취소 |
Error | Socket | 에러 상황을 조사하고 처리 |
ExclusiveAddressUse? | Socket | 단일 접근만 가능한 소켓의 바인드를 허용 |
Expedited | IP | 신속히 접근해야 할 데이터를 사용(한번만 설정할 수 있으며, 해제가 불가능하다.) |
HeaderIncluded? | IP | 소켓에 전달할 데이터에 헤더를 포함할 것을 명시 |
IPOptions | IP | 외부로 전송되는 패킷의 IP옵션을 명시 |
IpTimeToLive? | IP | 패킷의 TTL값을 설정 |
KeepAlive? | Socket | TCP keep-alive 패킷을 전송 |
Linger | Socket | 소켓을 닫은 이후 추가적인 데이터를 대기 |
MaxConnections? | Socket | 사용 가능한 최고 큐(queue)길이 설정 |
MulticastInterface? | IP 멀티캐스트 패킷에서 사용할 인터페이스 설정 | |
NoChecksum? | Udp | 체크섬을 0으로 설정한 UDP패킷을 전송 |
NoDelay? | Tcp | TCP패킷의 Nagle 알고르즘을 해제 |
OutOfBandInline? | Socket | 대역 외 데이터 수집을 허용 |
PacketInformation? | IP | 수집된 패킷에 대한 정보 반환 |
ReceiveBuffer? | Socket | 패킷 수신을 위해 예약된 전체 소켓당 버퍼를 설정 |
ReceiveLowWater? | Socket | Low water mark를 수집 |
ReceiveTimeout? | Socket | 타임아웃을 수집 |
ReuseAddress? | Socket | 소켓으로 하여금 사용 중인 포트 주소와 바인드하도록 허용 |
SendBuffer? | Socket | 패킷 전송에 예약된 전체 소켓당 버퍼를 설정 |
SendLowWater? | Socket | Low water mark를 전송 |
SendTimeout? | Socket | 타임아웃 값을 전송 |
Type | Socket | 소켓 타입을 조사 |
TypeOfService? | IP | IP type-of-service 필드 설정 |
UnblockSource? | IP | 소켓은 넌블로킹으로 설정 |
UseLoopback? | Socket | 가능할 경우 네트워크 인터페이스를 무시 |
public int Send(byte[] buffer);
public int Send(byte[] buffer, SocketFlags? flags);
public int Send(byte[] buffer, int length, SocketFlags? flags);
public int Send(byte[] buffer, int offset, int length, SocketFlags? flags);
public int Receive(byte[] buffer);
public int Receive(byte[] buffer, SocketFlags? flags);
public int Receive(byte[] buffer, int length, SocketFlags? flags);
public int Receive(byte[] buffer, int offset, int length, SocketFlags? flags);
SocketFlags?
값 | 설명 |
DontRoute? | 내부 라우팅 테이블을 사용하지 않고 바로 데이터를 전송 |
MaxIOVectorLength? | 데이터를 전송하고 수집하는데 사용되는 WSABUF 구조체에 대한 표준값을 제공 |
None | 이 전송에 대해서 어떤 플래그도 사용하지 않음 |
Partially | 메시지의 일부만을 전송하거나 수집 |
Peek | 수집하는 메시지를 peek |
public void Shutdown(SocketShutdown? how);
SocketShutdown?
값 | 설명 |
Send | 데이터 전송 작업을 중지. 추가적인 데이터를 전송하면 FIN을 전송 |
Receive | 데이터 수신 작업을 중지. 추가적인 데이터 받을경우 RST 전송 |
Both | 전송, 수신 작업 둘다 중지 |
'네트워크' 카테고리의 다른 글
네트워크 프로그래밍 TIME_WAIT 제거 (1) | 2012.03.24 |
---|---|
Network Programming 개발 참조사이트 링크 (0) | 2012.03.24 |