'2013/12/31'에 해당되는 글 5건

  1. 2013.12.31 주소체계와 데이터 정렬
  2. 2013.12.31 프로토콜
  3. 2013.12.31 윈도우 소켓
  4. 2013.12.31 소켓
  5. 2013.12.31 유니티 공식 사이트 데모 프로젝트

주소체계와 데이터 정렬

|

ip (Internet Protocol)

-인터넷 상에서 데이터를 송수신할 목적으로 컴퓨터에 부여하는 값

Port번호
프로그램상에서 생성되는 소켓을 구분하기 위해서 소켓에 부여되는 번호


port -> 16비트 0~ 65535
0~1023은 이미 용도가 결정되 있음
80번은 인터넷포트번호임



'웹관련' 카테고리의 다른 글

br 태그.  (0) 2014.12.23
주소체계와 데이터 정렬  (0) 2013.12.31
프로토콜  (0) 2013.12.31
윈도우 소켓  (0) 2013.12.31
소켓  (0) 2013.12.31
Trackback 0 And Comment 0

프로토콜

|

프로토콜

대화에 필요한 통신규약
프로토콜은 약속이다.

소켓 생성함수

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
->성공시 파일 디스크립터, 실패시 -1 반환

domain 소켓이 사용할 프로토콜 체계 정보전달
type 소켓의 데이터 전송방식에 대한 정보 전달
protocol 두 컴퓨터간 통신에 사용되는 프로토콜 전달

첫번째 인자 
프로토콜의 체계 종류
  1. PF_INET           IPV4 인터넷 프로토콜 체계
  2. PF_INET6         IPV6 인터넷 프로토콜 체계
  3. PF_LOCAL       로컬 통신을 위한 UNIX 프로토콜 체계
  4. PF_PACKET     Low Level 소켓을 위한 프로토콜 체계
  5. PF_IPX              IPX 노벨 프로토콜 체계

1번만 알면 됨
나머지는 잘 사용 안됨

두번째 인자
소켓의 데이터 전송방식
 PF_INET에는 둘이상 전송방식이 있음
대표적 두가지 전송 타입
-연결 지향형 소켓타입(SOCK_STREAM) TCP
-비연결 지향형 소켓 타입(SOCK_DGRAM) UDP


tcp 특성 예제



#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void ErrorHandling(char * message);

int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;

char message[30];
int strLen = 0;
int idx=0, readLen=0;

if(argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0]);
exit(0);
}

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
ErrorHandling("WSAStartup() error!");
}

hSocket = socket(PF_INET, SOCK_STREAM, 0);
if(hSocket == INVALID_SOCKET)
{
ErrorHandling("socket() error!");
}

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
servAddr.sin_port = htons(atoi(argv[2])); //port

if(connect(hSocket, (SOCKADDR *)&servAddr,sizeof(servAddr)) == SOCKET_ERROR)
{
ErrorHandling("connect() error!");
}
while(readLen=recv(hSocket, &message[idx++], 1, 0))
{
if(readLen==-1)
{
ErrorHandling("read() error!");
}

strLen += readLen;
}

printf("Message from server : %s \n", message);
printf("Function read call count :%d \n", strLen);
closesocket(hSocket);
WSACleanup();

return 0;
}

void ErrorHandling(char * message)
{
fputs(message,stderr);
fputc('\n', stderr);
exit(1);
}


'웹관련' 카테고리의 다른 글

br 태그.  (0) 2014.12.23
주소체계와 데이터 정렬  (0) 2013.12.31
프로토콜  (0) 2013.12.31
윈도우 소켓  (0) 2013.12.31
소켓  (0) 2013.12.31
Trackback 0 And Comment 0

윈도우 소켓

|

윈도우 소켓


윈속 초기화

#include <winsock2.h>
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
->성공시 0, 실패 시 0이 아닌 에러코드 값 반환
-> wVersionRequested 프로그래머가 사용할 윈속의 버전정보 전달
-> lpWSAData WSADATA라는 구조체 변수의 주소 값 전달.

->윈속 기반 프로그래밍에서는 공식과 같이 등장
 
int main(int argc, char * argv[])
{
WSDATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHandling(“WSAStartup() error!”);
...

return 0;
}
상위 8비트는 부버전, 하위 8비트는 주버전

MAKEWORD(1, 2) -> 주버전 1, 부버전 2 , 0x0201반환 ->2진수 16진수 513
MAKEWORD(2, 2) -> 주버전 2, 부버전 2, 0x0202 반환



윈속 라이브러리 해제
#include <winsock2.h>
int WSACleanup(void);
->성공시 0, 실패 시 SOCKET_ERROR 반환

프로그램이 종료되기 직전에 호출하는 것이 보통임

윈도우 소켓 관련 함수

#include <winsock2.h>
SOCKET socket(int af, int type, int protocol);
->성공시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

#include <winsock2.h>
int bind(SOCKET s, const sturct sockaddr * name, int namelen);
->성공시 소켓 핸들, 실패 시 SOCKET_ERROR 반환

#include <winsock2.h>
int listen(SOCKET s, int backlog);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

#include <winsock2.h>
SOCKET accept(SOCKET s, struct sockaddr * addr, int * addrlen);
->성공 시 소켓 핸들, 실패 시 INVALID_SOCKET 반환

#include <winsock2.h>
int connect(SOCKET s, const struct sockaddr * name, int namelen);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

소켓을 닫을때
#include <winsock2.h>
int close socket(SOCKET s);
->성공 시 0, 실패 시 SOCKET_ERROR 반환

//입출력함수

#include <winsock2.h>
int send(SOCKET s, const char * buf, int len, int flags);
->성공 시 전송된 바이트 수, 실패 시 SOCKET_ERROR 반환

s-> 데이터 전송 대상과의 연결을 의미하는 소켓의 핸들 값 전달
buf-> 전송할 데이터를 저장하고 있는 버퍼의 주소 값 전달.
len -> 전송할 바이트 수 전달
flags -> 데이터 전송 시 적용할 다양한 옵션 정보 전달.


//입출력함수
#include <winsock2.h>
int recv(SOCKET s, const char * buf, int len, int flags);
->성공 시 수신한 바이트 수(단 EOF 전송 시 0), 실패 시 SOCKET_ERROR 반환

s-> 데이터 수신 대상과의 연결을 의미하는 소켓의 핸들 값 전달
buf-> 수신된 데이터를 저장할 버퍼의 주소 값 전달.
len -> 수신할 수 있는 바이트 수 전달
flags -> 데이터 수신 시 적용할 다양한 옵션 정보 전달.





예제소스

서버

#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>

void ErrorHandling(char * message);

int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;

int szClntAddr;
char message[] = "Hello World!";
if(argc!=2)
{
printf("Usage : %s <port> \n", argv[0]);
exit(1);
}

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
ErrorHandling("WSAStartup() error!");
}

hServSock = socket(PF_INET, SOCK_STREAM, 0);
if(hServSock == INVALID_SOCKET)
{
ErrorHandling("socket() error!");
}

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(atoi(argv[1]));

if(bind(hServSock,(SOCKADDR *)&servAddr,sizeof(servAddr)) == SOCKET_ERROR)
{
ErrorHandling("bind() Error!");
}

if(listen(hServSock, 5) == SOCKET_ERROR)
{
ErrorHandling("listen() Error!");
}

szClntAddr = sizeof(clntAddr);
hClntSock = accept(hServSock, (SOCKADDR *) &clntAddr, &szClntAddr);
if(hClntSock == INVALID_SOCKET)
{
ErrorHandling("accept() error!");
}

send(hClntSock, message, sizeof(message), 0);
closesocket(hClntSock);
closesocket(hServSock);
WSACleanup();
return 0;
}
void ErrorHandling(char * message)
{
fputs(message,stderr);
fputc('\n', stderr);
exit(1);
}



클라이언트


#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
void ErrorHandling(char * message);

int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET hSocket;
SOCKADDR_IN servAddr;

char message[30];
int strLen;
if(argc != 3)
{
printf("Usage : %s <IP> <port>\n",argv[0]);
exit(0);
}

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
{
ErrorHandling("WSAStartup() error!");
}

hSocket = socket(PF_INET, SOCK_STREAM, 0);
if(hSocket == INVALID_SOCKET)
{
ErrorHandling("socket() error!");
}

memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]); //ip
servAddr.sin_port = htons(atoi(argv[2])); //port

if(connect(hSocket, (SOCKADDR *)&servAddr,sizeof(servAddr)) == SOCKET_ERROR)
{
ErrorHandling("connect() error!");
}

strLen=recv(hSocket,message,sizeof(message)-1, 0);
if(strLen == 1)
ErrorHandling("read() error!");
printf("Message from server : %s \n", message);
closesocket(hSocket);
WSACleanup();

return 0;
}

void ErrorHandling(char * message)
{
fputs(message,stderr);
fputc('\n', stderr);
exit(1);
}





'웹관련' 카테고리의 다른 글

br 태그.  (0) 2014.12.23
주소체계와 데이터 정렬  (0) 2013.12.31
프로토콜  (0) 2013.12.31
윈도우 소켓  (0) 2013.12.31
소켓  (0) 2013.12.31
Trackback 0 And Comment 0

소켓

|

소켓

네트워크 망의 연결에 사용되는 도구
네트워크를 통한 두 컴퓨터의 연결

소켓 구분 
1.tcp
전화기에 비유(전화망을 통해서 음성 데이터를 주고받음) 사실상 소켓이나 마찬가지

소켓은 거는 용도의 소켓을 완성하는 방식과
받는 용도의 소켓을 완성하는 방식에 차이가 있음

소켓 생성함수

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
->성공시 파일 디스크립터, 실패시 -1 반환

소켓 주소정보 할당(ip 와 port번호)

 #include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
-> 성공시 0, 실패 시 -1 반환

소켓이 연결이 가능한 상태가 되게 하는 함수

 #include <sys/socket.h>
int listen<int sockfd, int backlog);
->성공시 0, 실패시 -1 반환

누군가 데이터의 송수신을 위해 연결 요청을 해오면
다음 함수호출을 통해서 그 요청을 수락함

#include <sys/socket.h>
int accept(int socked, struct sockaddr *addr, socklen_t *addrlen);
->성공시 파일 디스크립터, 실패시 -1 반환

요약
연결요청을 허용하는 소켓생성과정

1단계 소켓생성   socket  함수 호출
2단계 ip주소와 port번호 할당 bind 함수호출
3단계 연결요청 가능상태로 변경 listen 함수호출
4단계 연결요청에 대한 수락 accept 함수호출

(서버 소켓)
연결요청을 수락하는 기능의 프로그램을 지칭함
(전화를 받는)

클라이언트 소켓(전화를 거는)

전화를 거는 기능의 함수
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
->성공시 0, 실패 시 -1 반환

클라이언트 프로그램은
소켓의 생성(socket 함수호출)과 서버로 연결요청(connect 함수호출) 과정만 존재한다.


파일디스크립터
  • 운영체제가 만든 파일또는 소켓의 지칭을 편히 하기 위해서
숫자를 부여한것


2.xxx


'웹관련' 카테고리의 다른 글

br 태그.  (0) 2014.12.23
주소체계와 데이터 정렬  (0) 2013.12.31
프로토콜  (0) 2013.12.31
윈도우 소켓  (0) 2013.12.31
소켓  (0) 2013.12.31
Trackback 0 And Comment 0

유니티 공식 사이트 데모 프로젝트

|

http://unity3d.com/gallery/demos/demo-projects

Trackback 0 And Comment 0
prev | 1 | next