본문 바로가기

네트워크

컴파일러별 소켓 설정 옵션

소켓 기반 네트워크 프로그래밍에서는 패킷을 전송하고 수집하기 위해 직접 네트워크 인터페이스 장치를 접근할 필요가 없다. 대신, 네트워크와의 프로그래밍 인터페이스를 처리해줄 중간 단계의 파일 기술자를 생성하여 사용한다. 네트워크 연결을 참조하는데 사용하는 특정 파일 기술자를 소켓(socket)이라 부른다. 
    네트워크 연결 또는 유닉스 프로세스간 통신(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? 인스턴스를 생성한다.
SocketAddress? 클래스는 IPEndPoint?객체의 일련화된 형태를 나타내는 System.Net 이름영역에 존재하는 특별한 클래스이다. 
이 클래스는 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 전송, 수신 작업 둘다 중지