'[ 충남인력개발원 ] (2019)/┗TCP&IP'에 해당되는 글 43건

0번은  이니 프로세스

cpu 살리고 운영체열고 

 

가게 문 열어서 시작하고

 

1번은 그다음 컴터 시작하는 거겟지뭐

 

 

프로세스를 2개 만들어서 멀티 하는법

혹은 

쓰레드를 이용해서 함수를 2개 만들어서 멀티 하는 방법

 

 

 

예를 들어 집이 2칸 짜리 방이 있는데

방에 한사람씩 넣으면 돈은 많이 드는데 

좋움 안싸움

 

근데 방은 한칸인데 사람 을 2명 넣으면 

돈은 적게 들지만 싸움 

 

그럼 어떻게 잘 한방에서 살게 나눠주냐 같은 문제인듯

 

 

 

Mutex 스레드를 사용 하기위해서 Muyual Exclusion 을 같이씀

 

 

인티져 한계치까지 스레드를 만들수 있음 

 

POSLX 리눅스 별명 

 

실행파일 좀 수정해야함

 gcc -o 실행이름정하기 파일이름.c  -lpthread  (이거 엘 피 티 에이치 알 이 에이 디)임

 

쓰레드가 태어나면 쓰레드 아이디 가만들어진다

 

#incldue <pthread.h>

int pthread_create {
	pthread_t *restrict thread, const pthread_attr_t *restrict attr,
    void *(*start_routine)(void*), void *restrict arg
};

스레드의 구성도

아이디, 속성, 함수, 인자

아이디 주민번호

속성 시작부터 잘래 일할래

함수 어떤함수에 보낼까

인자 여따 다부어서 보내면됨

 

 

cost 는 1바이트 ????

 

 

펑션 포인트  함수 포인트 공부해야될듯???????? 

void *(*start_routine)(void*) 이거 이해안되면 공부 해야함 

(void *)로 모두 바꿀수 있다?????퍄           

스레드 평션 

 

콜 빛 함수

서비스 함수 라고 부르는데

 

리턴 타입이 void 포인트여야하고 

들어가는 것(파라미)도 void 포인트여야한다

리턴타입도 파라미도 같은 크기로 만들어야 한다.

 

void 포인터는 모든걸 보넬수 있다.(주소를 보내는것이다)

 

void *restrict arg 는 보내줄 구조체 임

여따가 막 밖어서 보내주는거임

 

 

 

동적할당이란?

 

 우선 c언어에서는 메모리 할당 방식의 종류가 2가지로 나뉘는데 한가지는 정적인 방식과 동적인 방식으로 나뉜다.

정적인 방식 : 프로그램 실행 전 변수의 저장공간을 먼저 할당 후 프로그램 종료시 해제.

Ex) int a[10] = 0;

 

동적인 방식 : 프로그램 실행 중 필요한만큼의 메모리를 할당 후 원할때 해제.

 

동적할당은 언제, 왜 필요할까?

  동적할당은 상당이 많은 상황에서 꼭 필요합니다. 예를 들어 영어이름을 저장하는 char배열을 만든다고 가정할때 char 배열의 크기를 얼마나 크게 잡아야 할까? 대충 15글자로 정했다고 하면 아래와 같이 배열을 만들것이다.

char name[15];

 

             □ 

 

그렇다면 만약에 name에다가Hong Gil dong 이라는 이름을 넣으면 name

 이라는 배열에 총 13글자가 들어간다. 

 

■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ 

 

하지만 이 배열의 크기는 15인데 13만들어가면 2라는 크기의 메모리가 낭비된다.

 

그리고 만약에 Hong Myeong seong 이라는 이름을 넣으면 이 배열에

17글자가 들어간다. 즉 15라는 배열의 크기를 초과했다.

 

■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■   ■ 

 

이처럼 오버플로우 위험 또한 생긴다.

 

그래서 이럴때 사용하는 것이 동적할당이다.

 

 

동적할당의 사용방법

 

 malloc 함수로 동적할당함. (C 언어의 표준 라이브러리로 stdlib.h에 정의)

 

 

malloc함수

 

예를 들어 malloc(4)를 하면 4byte 만큼의 메모리를 할당받는다.

사용의 예를 들어보자면 다음과 같다.

 

Ex) int *i = (int*) malloc (sizeof(int));

 

 

 

위와 같이 i라는 포인터 변수를 선언하고 i값에다가 메모리를 할당하는 것이다.

sizeof(int)는 4와 같으니 malloc함수에 4byte의 메모리를 할당 받고 int 형으로 바꾸어 주는 것이다.

만약에 malloc(sizeof(int))는 그대로 하고 앞에 int*을 int형이 아니라 short형으로 바꾼다면 i라는 변수는 short형의크기의 배열 2개가 선언됩니다.

 

예를들어 input을 받아 input 만큼 배열의 크기를 할당받고 싶다면

int *arr = (int*) malloc(sizeof(int)*input);

이런식으로 하면 된다.

 

free함수

 

할당된 메모리를 해제하는 함수이다.

메모리를 할당 받고 메모리가 해제되지 않으면 할당받은 메모리는 사용이 끝났음에도 불구하고 컴퓨터가 종료되기 전까직 해당 메모리를 차지하게 된다.

따라서 메모리를 할당만 하고 해제를 안하면 언젠가는 메모리가 부족해지는 현상이 발생하게된다. 때문에 동적할당 후 더 사용할 이상 필요가 없다면 꼭 free함수로 메모리를 해제 시켜주어야 한다.

 

다음 같이 메모리를 할당을 해주었으면 

 

int *arr = (int*) malloc(sizeof(int)*input);

 

 

마지막에는 꼭 다음과 같이 메모리를 꼭 해제 시켜 주어야 한다.

 free(arr_2); 

 

 

 

 

 

 

동적할당의 장점과 단점

 

-장점 상황에 따라 원하는 크기만큼의 메모리가 할당되므로 경제적이며, 이미 할당된 메모리라도 언제든지 크기를 조절할 수 있다.

 

-단점 : 더 이상 사용하지 않을 때 명시적으로 메모리를 해제해 주어야 한다.

 



출처: https://phaphaya.tistory.com/9 [pAPaYA]

 

 

 

 

 

 

 

 

 

 

 

 

리눅스 드라이버=====운영체제 만드는 공부 임니다~~!! 

책 사서 공부해 보기

 

 

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

쓰레드 주고 받기 덮어쓰기 없에기  (0) 2019.11.27
쓰레드 주고 받기 우아아  (0) 2019.11.27
git hub 추가 하기  (0) 2019.11.27
브로드 캐스트  (0) 2019.11.26
리눅스의 실행 방식  (0) 2019.11.26
블로그 이미지

Or71nH

,

까먹을 까봐 다시 올림 일단 이거임 

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

쓰레드 주고 받기 우아아  (0) 2019.11.27
프로세스 쓰레드  (0) 2019.11.27
브로드 캐스트  (0) 2019.11.26
리눅스의 실행 방식  (0) 2019.11.26
송수신 사진으로 보기  (0) 2019.11.26
블로그 이미지

Or71nH

,

 

과제

 

bread Caster 

 

IP 와 dlfmadmf QNfuwndjfk

 

 

Reveiver 

ip: 이름 

 

1치면 다보냄  ??????????????암튼 그럼

 

 

 

소스를 써보자

 

얘는 보내는넘 news_sender_brd.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30 
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int send_sock;
	struct sockaddr_in broad_adr;
	FILE *fp;
	char buf[BUF_SIZE];
	int so_brd=1;
	if(argc!=3) {
		printf("Usage : %s 127.0.0.49 9190 \n", argv[0]);
		exit(1);
	}
 
	send_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&broad_adr, 0, sizeof(broad_adr));
	broad_adr.sin_family=AF_INET;
	broad_adr.sin_addr.s_addr=inet_addr(argv[1]);
	broad_adr.sin_port=htons(atoi(argv[2]));

	setsockopt(send_sock, SOL_SOCKET,
		SO_BROADCAST, (void*)&so_brd, sizeof(so_brd));
	if((fp=fopen("news.txt", "r"))==NULL)
		error_handling("fopen() error");
	
	while(!feof(fp))
	{
		fgets(buf, BUF_SIZE, fp);
		sendto(send_sock, buf, strlen(buf),
			0, (struct sockaddr*)&broad_adr, sizeof(broad_adr));
		sleep(2);
	}
	close(send_sock);
	return 0;
}

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

news_receiver._brd.c 애는 받는넘

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30
void error_handling(char *message);

int main(int argc, char *argv[])
{
	int recv_sock;
	struct sockaddr_in adr, hows_adr;
	socklen_t adr_sz;
	int str_len;

	char *str;
	char str_arr[20];

	char buf[BUF_SIZE];
	if(argc!=2) {
		printf("Usage : %s 9190 \n", argv[0]);
		exit(1);
	}

	recv_sock=socket(PF_INET, SOCK_DGRAM, 0);
	memset(&adr, 0, sizeof(adr));
	adr.sin_family=AF_INET;
	adr.sin_addr.s_addr=htonl(INADDR_ANY);
	adr.sin_port=htons(atoi(argv[1]));

	if(bind(recv_sock, (struct sockaddr*)&adr, sizeof(adr))==-1)
		error_handling("bind() error");
	while(1)
	{
		str_len=recvfrom(recv_sock, buf, BUF_SIZE-1, 0, (struct sockaddr*)&hows_adr, &adr_sz);
		if(str_len<0)
			break;
		
		str = inet_ntoa(hows_adr.sin_addr);
		strcpy(str_arr, str);
		printf("%s \n", str);	
		
		buf[str_len]=0;
		fputs(buf, stdout);
	}
	close(recv_sock);
	return 0;
}

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

 

글구 이제 음...

다시 gcc 해줘야 함 잘 gcc 해줘서 다 실행파일 만들고

 

보내기전 

 

 

보내기후 

!!!

 

 

그이후 아무나 막 보넨다 IP 다찾아 주고 있긴하지만

 

 

 

 

암튼 핵심은 

 

 

inet_ntoa 함수 임

 

 

문자열 정보 -> 네트워크 바이트 순서의 정수(3)

2018.10.13

 

-

 

-

 

inet_ntoa 함수는 이름에서 알 수 있듯이 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보

 

우리가 쉽게 인식할 수 있도록 문자열 형태로 변환해주는 함수이다.

 

-

 

위 함수는 인자로 전달된 정수형태의 IP정보를 참조하여 문자열 형태의 IP정보 변환해서,

 

변환된 문자열의 주소 값을 반환한다.

 

그런데 이 함수를 호출하는데 있어서 주의해야 할 점이있다.

 

그것은 반환형이 char형 포인터라는 사실이다.

 

문자열의 주소 값이 반환된다는 것 이미 문자열이 메모리 공간에 저장되어있다는 뜻이다.

 

그런데 이 함수는 프로그래머에게 메모리 공간의 할당을 요구하지 않는다.

 

대신에 함수 내부적으로 메모리 공간을 할당해서 변환된 문자열 정보를 저장한다.

 

따라서 이 함수호출 후에는 가급적 문자열 정보를 다른 메모리 공간에 복사해 두는 것이 좋다.

 

 다시 inet_ntoa 함수가 호출되면 전에 저장된 문자열 정보가 지워질 수 있기 때문이다.

 

즉, inet_ntoa 함수 재 호출되기 전까지만 반환된 문자열의 주소 값이 유효하니,

 

오랫동안 문자열 정보를 유지해야 한다면 별도의 메모리 공간에 복사해둬야 한다.

 

좀 더 쉽게 쓰자면, inet_ntoa 함수가 호출되면 프로그래머가 직접 메모리 공간을 할당하는 것이 아니라,

 

inet_ntoa 함수 자체에서 메모리 공간을 할당하므로, 다시 inet_ntoa 함수호출이 되면

 

inet_ntoa 함수가 만든 메모리에 있던 전 데이터는 지워진다.

 

그러므로 다시 inet_ntoa 함수호출이 되기 전에 한번 다른 메모리 공간에 데이터를 저장해두고

 

호출해야한다.

 

아래의 사용 예제를 봐보자.

 

-

 

 inet_ntoa.c

 intoa

 

 

-

 

14번째 줄 : 구조체 변수 addr1에 저장된 IP정보를 전달하면서 inet_ntoa 함수를 호출하고 있다.

 

따라서 IP주소 정보를 담은 문자열의 주소 값이 반환된다.

 

-

 

15번째 줄 : 14번째 줄의 함수호출로 반환된 주소 값을 참조해서 문자열을 복사한다.

 

-

 

18, 19번째 줄 : inet_ntoa 함수가 다시 한번 호출되었다.

 

이로써 14번째 줄에서 반환된 주소 값에는 다른 문자열 정보가 채워진다.

 

이를 19번째 줄에서 출력한다.

 

-

 

20번째 줄 : 15번째 줄에서 문자열을 복사해뒀기 때문에

 

14번째 줄의 함수호출을 통해서 얻은 문자열을 재 출력할 수 있다.

 

-

 

실행결과

 

https://ss0x00.tistory.com/64

 

(리눅스) 문자열 정보를 네트워크 바이트 순서의 정수로(3)

문자열 정보 -> 네트워크 바이트 순서의 정수(3) 2018.10.13 - - inet_ntoa 함수는 이름에서 알 수 있듯이 네트워크 바이트 순서로 정렬된 정수형 IP주소 정보를 우리가 쉽게 인식할 수 있도록 문자열 형태로 변..

ss0x00.tistory.com

 

 

이분 잘함 ㅇㅇ

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

프로세스 쓰레드  (0) 2019.11.27
git hub 추가 하기  (0) 2019.11.27
리눅스의 실행 방식  (0) 2019.11.26
송수신 사진으로 보기  (0) 2019.11.26
Linux(리눅스) fg, bg, kill, Ctrl+Z  (0) 2019.11.26
블로그 이미지

Or71nH

,

무슨파일.c 

가 있으면  그것을 gcc 해주면 그파일을 

컴퓨터 언어로 변역하여 

새로운 파일을 만든다

그것이 실행 파일이다.

 

 

완전이 다른 존재의 파일 

 

wiresharp  남의 예기를 다 볼수 있다

암호화가 필요하다 

 

암포화 샘플 128bit 

 

 

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

git hub 추가 하기  (0) 2019.11.27
브로드 캐스트  (0) 2019.11.26
송수신 사진으로 보기  (0) 2019.11.26
Linux(리눅스) fg, bg, kill, Ctrl+Z  (0) 2019.11.26
송수신 보기  (0) 2019.11.26
블로그 이미지

Or71nH

,

일단 읽는게 5줄씩 됨 

 

 

저거 코드는 2번 이전글 가면됨 송수신 치면 나올듯

 

 

난 조금 수정햇움

 

이제 잣 같은 코드 치기 

 

왼쪽이 받는넘                    지금 열렷움  받을 준비중                              오른쪽이 보내는넘 앤터치면 날림

 

중요 저기 주소 랑 포트 번호 같게 해야함 ㅇㅇㅇㅇ

 

 

텍스트 에 써져있던거 한줄씩 한줄씩 써짐 

 

해보면 암 ㅇㅇ

'[ 충남인력개발원 ] (2019) > ┗TCP&IP' 카테고리의 다른 글

브로드 캐스트  (0) 2019.11.26
리눅스의 실행 방식  (0) 2019.11.26
Linux(리눅스) fg, bg, kill, Ctrl+Z  (0) 2019.11.26
송수신 보기  (0) 2019.11.26
sendto() 소켓으로 데이터를 전송  (0) 2019.11.26
블로그 이미지

Or71nH

,