./hserver 9190

             이번호 같아야함

 

./hclient127.0.0.1 9190 (옌 백슬레쉬 아님)

           IP          port

 

루프백 주소로 들어간다

이유는 컴퓨터가 같음 즉 한곳 에서 같이 쓰는것이기 때문에 ip가 같다고 지정하고 실행함 스타 UDP 같은듯

 

그냥다음에 한번더듣자 이해잘안감

bind 함수가 뭔지 모르겟다 걍 잘이어주는에인가?

블로그 이미지

Or71nH

,

네트워크 전송 방식을 하나로 통일한다

 

예로들어

 

 

 

 

      받는방법 12                                                     받는방법 12 

12하하 너 뭐해  -----------------------------------> 하하 너 뭐해 

 

=================================================

 

       받는방법 h23                                                받는 방법 12 

h23 뭐하냐니깐 ------------------------------------>  %$@#$??

 

    받는방법 h23                                                    받는 방법 12 

  ??????   <------------------------------------------- 뭔 개소리야?

 

보네는넘                                                         받는넘

 

다르면 쪼개기가 안되서 글자 나누기 않됨

동일 한 크기 조건을 넣어줘서  어디까진 주소로 딱 약속해야함

 

 

 

빅 엔디안(Big Endian)                                          |

상위 바이트 값을 작은 번지수에 저장                      |       거의 이거쓴단다

         

리틀 엔 디안(Little Endian)

 상위 바이트의 값을 큰 번지수에 저장

 

 

호스트 바이트 순서 

   CPU 별 데이터 저장방식을 의미함

 

네트워크 바이트 순서 

   통일된 데이터 송수신 기준을 의미함                   |

   빅 엔디안이 기준이다.                                     |                      거의 이거서 쓴단다

 

 

 

소켓 생성된 다음에는 걍  자동으로 잘된다

 

근데 소켓을 호스팅하는거는 내가 해줘야 자동됨  이거만 해주면됨

 

 

unsigned short htons(unsigned short);

unsigned short ntohs(unsigned short);

unsigned long htons(unsigned long);

unsigned long ntohs(unsigned long);

 

 

 

그 h(host) 가 호스트를 말아고 

  n(network)를 말한단다

 

앞에꺼를 뒤에꺼로 바꿔라 라는 뜻이라고한다

 

short 는 port 바꾸는거고

long 은 ip 바꾸는거라고한다

 

ㅇㅇ 그러테 

 

 

#include <stdio.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
	unsigned short host_port=0x1234;
    unsigned short net_port;
    unsigned long host_addr=0x12345678;
    unsigned long net_addr;
    
    net_port=htons(host_port);
    net_addr=hton1(hont_addr;
    
    printf("Host ordered port: %#x \n", host_port);
    printf("Network ordered port: %#x \n", net_port);
    printf("Host ordered address: %#1x \n", host_addr);
    printf("'Network ordered address: %#1x \n", net_addr);
    return 0;
}

 

중간에 있는게 정보 변환해서 저장하는듯

자동화 된거같음

위에꺼는 리틀엔디안 

 

결과가 프린트 2개같으면 리틀

 

프린트 2개가 다르면 빅엔디안 ㅇㅋ?

블로그 이미지

Or71nH

,

IPv4 는  주소가 

2^32(이거 32승임 그 뭐시기냐 제곱같은거)

개있는데

 

IPv6 는 주소가

2^128 

개있다

 

IPv6가 많아서 좋움

 

 

 

인터넷 주소는 

 

___________________________________________

| 1 바이트 | 1바이트 | 1바이트 | 1바이트 |

|__________________________________________|

이리 되있움 

255.255.255.255개 넣을수 있으니

몇칸은 네트워크로 하고

몇칸은 호스트 (그니깐 공유기(라우더)낀넘들) 

 

 

앞쪽이 네트워크 ID 뒤가 호스트 ID 

 

클레스 A  NET.HOST.HOST.HOST

              0~127.  255 . 255 . 0

 

 

클레스 B  NET.NET.HOST.HOST

             128~191. 255.   0  .   0

클레스 C  NET.NET.NET.HOST

             192~223. 255. 255 .   0

 

클레스 D  NET.NET.NET.NET

             255. 255. 255. 255 (옌 멀티캐스트라고 부름)

 

뭔 가 서프넷이라고 내용 추가햇는데 바이트를 쪼개서 쓰고 싶은데 쓰는듯하다

 

이제 IP 가 끝나음

 

PORT 가면 

예는 컴터가 받았는데 컴터안에 또 여러놈들 있잖아

근데 누구한테 줘야할지 모르면 안되니깐

아파트 주소 택배아저씨가 온게 IP로 왓다면

 

이제 호수보고 맞는 이름인넘한테 넣어줘야함

그래서 컴터안에서 한번 더 나눠줘야함 필요한넘이 가져가게끔

 

PORT 번호는 16비트로 0~65535 이하로 되고

0~1023은 잘 알려진 PORT (Well-known PORT) 라 해서 이미 용도가 결정되어 있다??????????????

뭔말인지 모르지만 읽어야한다

 

인터넷에 포트는 80으로 약속되어있다고 한다 일단 약속이니 80쓰면 될듯

포트는 운영채제에 의존적임 이 그니깐 운영체제가 경비실 아저씨여서 우리 우체통 번호 막 바꾸면 나 제대로 못받음

블로그 이미지

Or71nH

,

드뎌 아까 함수 알려준다

 

#include <sys/socket.h>

 

int socket(int domain, int type, int protocol);

 나눠보자

 

domain  소켓이 사용할 프로토콜 체계(Protocol Family) 정보 전달.

type      소켓의 데이터 전송방식에 대한 정보 전달

protocol 두 컴퓨터간 통신에 사용되는 프로토콜 정보 전달.

 

한도메인에 타입이 나눠지고 그안에 프로토콜이 있다 

도메인

  L 타입

        L프로토콜

이런듯 안에 들어가있는듯 

 

 

프로토콜  종류들

 

PF_INET  ===== IPv4 인터넷 프로토콜 체계

PF_INET6 ===== IPv6 인터넷 프로토콜 체계

PF_LOCAL ===== 로컬 통신을 위한 UNIX 프로토콜 체계

PF_PACKET ===== Low Level 소켓을 위한 프로토콜 체계

PF_IPX ===== IPX 노벨 프로토콜 체계

 

 

 

 

 

PF_INET 

연결 지향형 소켓이랑 비연결 지향형 소켓이랑 2개임

1. 연결 지향형은 보냇는데 잘보내졋는지 확인도 해줌(SOCK_STREAM) 스트림 ㅇㅇ

좀느림

순서도 뒤바뀌지않음

데이터의 경개가 없음 

그니깐 난 찔끔식 주었는데  

받는에가 한번에 다 봄 

 내가 알파벳 하나씩보넴

a

p

p

l

y

근데 받는애가 짜증나서 한번에 5개 읽어냄

apply

이런듯

 

2. 비연결 지향형 ??? 걍 보내기만함?? (SOCK_DGRAM)이름도 디질래이네

걍보내니깐 빠름 안갈수도 있음 

걍 막던지니깐 순서 엉망임

데이터 없어져도 모름 보낸애도 받은줄암(확인을 안함)

순서 엉망이라 하나씩 읽어야함 뭉쳐봣자 못알아봄

내가 알파벳 하나씩 보넴

a

l

p

y

p

이러게 줘서  보낸 시간차로 정렬안하면 모름

 

크기가 제한된다 

다르게 보내면 받는애도 못알아봄

 

헤이~~

  |

  |

 V

#@$@% 이렇게 오는듯

 

 

이렇게 PF_INET 타입이 끝난듯

 

SOCK_STREAM 

이거는 IPPROTO_TCP 만 이어짐

그래서 0해도 저걸로 알아서 들어감

 

SOCK_DGRAM

이거는 IPPROTO_UDP 만 이어짐

그래서 얘도 0으로하면 알아서 들어간덴다

 

예제 다쓰자 이건 TCP 예제임

#include <"해더정보는 hello_client.c와 동일하므로 생략합니다.">
void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
    struct sockaddr_in serv_addr;
    char message[30];
    int str_len=0;
    int idx=0, read_len=0;
    
    if(argc!=3){
    	printf("Usage : %s <IP> <port>\n",argv[0]);
        exit(1);
	}

	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
    	error_handling("socket() error");
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=int_addr(argv[1]);
    serv_addr.sin_port=htons(atoi(argv[1]);
    
    if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
    	error_handling("connect() error!");
    
    while(read_len=read(sock, &message[idx++], 1))
    {
    	if(read_len == -1)
        	error_handling("read() error!");
            
        str_len+=read_len;
    }
    
    printf("Message form server: %s \n", message);
    printf("Function read call count: %d \n",str_len);
    close(sock);
    return 0;
}

void error_handling(char *message)
{
	//이전 예제와 동일하므로 생략! <--- 이렇게 되있어서 가져옴 
	fputs(message, stderr);
    fputc('\n',stderr);
    exit(1);
}

다햇어!!

이건 TCP 라 계속 일어 줘야한다고한다 전에 예제 보내는 곳에서 

한줄 한줄 정성것 써서 보냇으니깐

 

그줄수만큼 TCP 에서 줄 끝날때 까지 읽어와야함 

그른스 

while 보면 id 끝날떄까지 함

 

 

블로그 이미지

Or71nH

,

#include <sys/socket.h>

int connect(int sockfd, struct sockaddr * serv_addr, sockeln_t addrlen);

 성공시 0, 실패시 -1 반환

 

이젠 전화 거는놈 차례

#include <stdio.h>
#include <string.h>
#include <string.h>
#include <string.h>
#inclyde <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
    struct sockaddr_in serv_addr;
    char messagew[30];
    int str_len;
    if(argc!=3)
    {
    	printf("usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }

	sock=socket(PF_INET, SOCK_STREAM, 0);
    if(socket == -1 )
    	error_handling("socket() error");
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_Addr.sin_addr.s_addr=int_addr(argv[1]);
    serv_addr.sin_port=htons(atoi(argv[2]));
    
    if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))== -1 )
    	erro_handling("connect() error!");
        
    str_len=read(sock, message, sizeof(message)-1);
    if(str_len==-1)
    	error_handling("read() error!");
        
    printf("Message form server : %s \n", message);
    close(sock);
    return 0;
}

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

22번째줄 소켓 만들기 소켓을 만드는 순간에는 서버 소켓과 클라이언트 소켓으로 나뉘지 않는다?????????????????

bind listen 함수의 호출이 이어지면 서버 소켓이 되는 것이고, connect 함수 의 호출로 이어지면 클라이언트 소켓이 되는 것이다.

 

=====================뭔 개소리야?????????????==========================

 

 

31번째줄 connect 함수 호출을 통해서 서버 프로그램에 연결을 요청하고있다

 

 

암튼 리눅스 에서 보내는 넘까지 햇다

받는놈 회사에 보내면 아마 헬로우 라고 답장이 오겟지 ㅇㅇ

블로그 이미지

Or71nH

,