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

250hz

0.004ms

 

 

|이게 파이프 명령어이다

 

 

파일을 만들어서 

파일이 끝날때까지 보넨다

2byte 까지만 보넬수 있기때문인다

 

블록킹

데이터를 읽는데 없으면 

슬립이 된다

 

 

메인함수에 

하나씩 있기 때문에

전역 변수를 사용할수 있다

 

 

ubuntu SSH 설치하기

 

뭔가 우문트가 puty 로 안됨

5설치가 안된것 같다

 

sudo apt install openssh-server

이제 되는것 같다

뭔가 많다

https://winscp.net/eng/docs/lang:ko

 

WinSCP 소개 :: WinSCP

WinSCP 소개 WinSCP는 Windows용 그래픽 유저 인터페이스 SFTP 및 FTP 클라이언트 프로그램이고 오픈소스 프리웨어입니다. 레거시 SCP 프로토콜 역시 지원합니다. 이 프로그램을 사용하여 로컬 컴퓨터와 원격 컴퓨터 간에 안전하게 파일을 복사할 수 있습니다. 이 페이지에는 한국어 사용자를 위한 간략한 소개가 되어 있습니다. WinSCP 문서의 대부분은 영어입니다. 이 페이지에 링크되는 많은 페이지 대부분이 영어입니다. WinSCP 설치 Wi

winscp.net

 

윈도우에서도 우문트를 들어갈수 있게 설정

실행하면 이렇게 뜬다

file_client.c
0.00MB
file_server.c
0.00MB
Makefile
0.00MB

이제 파일 전송프로그램을 만들어 보자

sudo apt install make

 

이거 개꿀임 gcc 알아서 해줌

 

폴더안에있는  ls 들을 gcc 알아서 해줌

폴더 들어간다음 

make 

 

./file_server 5000 recv.c

실행파일 포트번호 생성할 파일명

 

 

 

make file 에 관하여 확인해보자

/// $띠우고 다음꺼 문장인듯
/// 이건 file_server 와 file_clinet
/// 만 된다

CC:=gcc

TARGET_SRV=file_server
TARGET_CLN=file_client


LDFLAGS=-D_REENTRANT -pthread //라이브러리를 알아서 가져와라

all : $(TARGET_SRV) $(TARGET_CLN)  //있나 없나 확인 앞부터 시작한다

$(TARGET_SRV):$(TARGET_SRV).o   //첫번째 가 존재하면 .o 부터 실행하고 만들어 지면 True로 안에 실행
	$(CC) -o $@ $< $(LDFLAGS)

$(TARGET_CLN):$(TARGET_CLN).o //두번째가 존재하면 실행
	$(CC) -o $@ $< $(LDFLAGS)

%.o:%.c   //위에 .o를 검색해거 없으면 true여서 안으로 들어간다
	$(CC) -c -o $@ $<  // @앞 %를 변수명으로 한다 앞의 %를 <에 대입한다

clean:
	rm -f *.o $(TARGET_SRV) $(TARGET_CLN)

이런식으로 참조를 해서 찾아가는 식으로 만든다

궁금한거 있으면 더알려주겟다

물어봐라

 

자동으로 들어가있는것은

시간의 차를 확인하고 최신거로 실행 파일을 만들어 준다

 

여긴 for 나 그런건 안된다

make 라는 새로운 언어 여서 기본 스크립트가 안된다

 

 

man open

뭔가 신기한거 나옴

뭔진 아직모르겟음

 

man 2 open 시스템 콜함수

 

man 3 strcpy

 

뭔가 실행 파일들의 정보를 알수있음

man~~~

좋음

https://www.joinc.co.kr/w/FrontPage

 

대문

 

www.joinc.co.kr

신기함

심심할때 

ls -al 눌러봐라

그럼 내가 실행하고 있는 파일이 숨어있다

저장안하고 꺼지던가 인터넷 나가면 파일 날라간거 아니니깐 확인해봐라

ps auwx | grep vi

kill -9 포트번호(아마내자리0000)

이러면 실행중이던 파일 \강제로 끌수있ㄲ다

 

다시 복원할려면

vi -r 파일이름 

이러면 작업하던거 다시 들어갈 수 있다

그리고 저장하고

 

rm .파일.swp를 지워준다

 

echo $? 

이건 메인의 리턴값을 볼수 있다

신기하네

블로그 이미지

Or71nH

,

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21813&cat1=22&cat2=596&cat3=606&lang=k

 

:::MySQL Korea:::

22.2.3.36. mysql_init() MYSQL *mysql_init(MYSQL *mysql) 설명 mysql_real_connect()함수에 맞는 MYSQL 오브젝트를 할당하고 초기화한다. 만약 mysql 가 NULL 포인터라면, 함수는 새로운 오브젝트를 할당하고 초기화하고 리턴한다. 그렇지 않으면, 오브젝트는 초기화되고, 오브젝트의 어드레스는 리턴된다. 만약 mysql_init() 함수가 새로운 오브젝트를 할당한다면, mysql_close() 함

www.mysqlkorea.com

 

블로그 이미지

Or71nH

,

비콘 위치기반 이미지 데이터 송신 프로그램.docx
1.21MB

프로젝트 결과물

프로젝트.zip
2.44MB

 

 

 

 

이미지는 바이너리(binary) 데이터이다.

MySQL은 바이너리 데이터를 저장할 때, BLOB 타입을 사용한다.

BLOP은 Binary Large Object의 약어이다.

BLOP 타입은 소팅이나 INDEX생성은 할 수 없다.

 

 

1. 테이블 추가

 

MySQL을 실행하고, 아래 명령어를 실행한다.

 

mysql> CREATE TABLE Images(Id INT PRIMARY KEY, Data MEDIUMBLOB);

 

MEDIUMBLOB 타입 데이터를 저장할 수 있는 Images 테이블을 생성한다.

BLOB 타입은 indexing을 할 수 없으므로,

INT형 Id 필드를 만들고 PRIMARY KEY로 선언한다.

MEDIUMBLOB 타입에서 이미지는 16MB까지 저장할 수 있다.

이외에도 TINYBLOB(255 Bytes), BLOB(64 KB), LONGBLOP(4GB) 타입이 있다.

 

 

 

2. 소스코드

 

그림 파일 하나를 Images 테이블에 저장하는 소스코드이다.

 

#include <my_global.h>

#include <mysql.h>

#include <string.h>

 

void finish_with_error(MYSQL *con)

{

fprintf(stderr, "%s \n", mysql_error(con));

mysql_close(con);

exit(1);

}

 

int main(int argc, char** argv)

{

// picture.jpg read binary(rb)모드로 파일을 연다.

// 실행파일과 같은 경로에 사진이 있어야 한다.

FILE *fp = fopen("picture.jpg", "rb");

if (fp == NULL) {

fprintf(stderr, "cannot open image file \n");

exit(1);

}

 

// 파일 포인터를 파일의 끝으로 옮긴다.

fseek(fp, 0, SEEK_END);

 

if (ferror(fp)) {

fprintf(stderr, "fseek() failed \n");

int r = fclose(fp);

 

if (r == EOF) {

fprintf(stderr, "cannot close file handler \n");

}

exit(1);

}

 

// 파일의 처음부터 파일 포인터가 가리키는 곳까지의 크기를 flen에 저장

int flen = ftell(fp);

if (flen == -1) {

perror("error occurred");

int r = fclose(fp);

if (r == EOF) {

fprintf(stderr, "cannot close file handler \n");

}

exit(1);

}

 

// 파일 포인터를 파일의 시작으로 옮김

fseek(fp, 0, SEEK_SET);

if (ferror(fp)) {

fprintf(stderr, "fseek() failed \n");

int r = fclose(fp);

 

if (r == EOF) {

fprintf(stderr, "cannot close file handler \n");

}

exit(1);

}

 

// 이미지 데이터를 저장할 배열 동적할당

char* data = (char *) malloc(sizeof(char) * (flen+1));

 

// 이미지 저장 함, 저장된 바이트 수가 size에 반환 됨

int size = fread(data, 1, flen, fp);

if (ferror(fp)) {

fprintf(stderr, "fread() failed \n");

int r = fclose(fp);

if (r == EOF) {

fprintf(stderr, "cannot close file handler \n");

}

exit(1);

}

 

// 파일 닫기

int r = fclose(fp);

if (r == EOF) {

fprintf(stderr, "cannot close file handler \n");

}

 

// MYSQL 구조체 초기화

MYSQL *con = mysql_init(NULL);

if (con == NULL) {

fprintf(stderr, "mysql_init() failed \n");

exit(1);

}

 

// 서버 연결

if (mysql_real_connect(con, "localhost", "user01", "1q2w3e!", "testdb",

0, NULL, 0) == NULL)

{

finish_with_error(con);

}

 

char* chunk = (char *)malloc(sizeof(char) * (2*size + 1));

mysql_real_escape_string(con, chunk, data, size);

 

char *st = "INSERT INTO Images(Id, Data) VALUES(1, '%s')";

size_t st_len = strlen(st);

 

char *query = (char *)malloc(sizeof(char) * (st_len + 2*size + 1));

int len = snprintf(query, st_len + 2*size + 1, st, chunk);

 

if (mysql_real_query(con, query, len)) {

finish_with_error(con);

}

 

mysql_close(con);

exit(0);

}

 

 

char* chunk = (char *)malloc(sizeof(char) * (2*size + 1));

mysql_real_escape_string(con, chunk, data, size);

 

binary data에서 중간에 삽입된 종결문자를 없애는 과정이다.

종결문자에 \, ', ", Ctrl+z 등이 있지만 아래에서는 \만으로 설명한다.

mysql_real_escape_string()함수는 문자열의 종료를 의미하는 '\0' 앞에

\를 붙여 '\\0'으로 만든다.

 

또한 이 함수를 사용함으로써 SQL injection attack도 예방할 수 있다.

(SQL injection attack 참고 : https://opentutorials.org/module/411/3962)

 

\를 붙이는 작업 때문에 최악의 경우 원래의 데이터의 2배짜리 버퍼가 필요하다

따라서 data버퍼 size의 2배 +1 만큼의 길이를 chunk에 할당한다.

 

 

char *st = "INSERT INTO Images(Id, Data) VALUES(1, '%s')";

size_t st_len = strlen(st);

 

쿼리문을 구성하고, strlen 함수를 통해 이 쿼리문의 길이를 구해 st_len에 저장.

 

 

char *query = (char *)malloc(sizeof(char) * (st_len + 2*size + 1));

int len = snprintf(query, st_len + 2*size + 1, st, chunk);

 

최종적으로 MySQL 서버에 보낼 쿼리문을 구성하는 과정이다.

앞서 구했던 '쿼리문의 길이'와 'chunk의 길이'를 합한

'st_len + 2*size + 1'만큼을 동적할당 한다.

그리고 snprintf를 통해서 query버퍼에 st와 chunk를 가지고

이미지 저장을 요청하는 쿼리문을 완성한다.

 

if (mysql_real_query(con, query, len)) {

finish_with_error(con);

}

 

이전까지는 mysql_query() 함수를 통해 데이터를 넣었었다.

mysql_query() 함수는 binary 데이터가 포함된 쿼리를 처리하지 못한다.

여기서는 binary 데이터를 취급하기 때문에 mysql_real_query() 함수를 사용한다.

 

 

 

 

아래 링크를 참고하여 번역 및 수정함 

http://zetcode.com/db/mysqlc/

 

 

다른 참조

http://jidolstar.tistory.com/681

 

http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21872&cat1=22&cat2=596&cat3=606&lang=k



출처: https://www.molllab.com/15 [mollLab]

출처: https://www.molllab.com/15 [mollLab]

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

Uduntu window 통신  (0) 2020.01.13
MYSQL의 모든것  (0) 2020.01.08
프로젝트 분석  (0) 2019.11.29
mysql 더 설치하기 ㅎㅎ...  (0) 2019.11.28
Mysql 리눅스 연동하기  (0) 2019.11.28
블로그 이미지

Or71nH

,

비콘 위치기반 이미지 데이터 송신 프로그램.docx
0.51MB

소프트웨어 6단계 개발 절차

1. Requirement 

2. Analysis           요구사항 정의서

3. Design            설계 시작

4. Implement       프로그램 짜기

5. Test                에러잡고 디버깅   이게 길게걸림

6. Deployment     사용법 

 

 

 

2017.09.22 프로젝트의 분석과 설계_rev2.pdf
0.47MB

설계하는법

 

버퍼에서 

sprintf(buf,"%d", n);

sscanf("buf,"%lf",&d);

블로그 이미지

Or71nH

,

뭔가 더추가해야한다

위에 설치를 완료하고 시작 하면 된다

 

 

 

이건 주말에 복스임..

 

 

 

 

들어간다음

 

ㄴshow databases ;

로 확인을하고

 

데이터 배이스를 만들어보자 

 

이제 테이블도 만들고 

 

엔터 지면 -> 이 생김

mysql> create table test (name char(10), 
    -> age int,
    -> pet char(10)
    -> );

 

에러가 떳다 

데이터 베이스가 정해지지 않아서 ,,

use test;

mysql> create table test (name char(10),  age int, pet char(10) ); 

를 하고 다시쳐준다

 

이제 글좀 써넣어 보자

 

insert into test values ('me', '20', 'cat');

만들고 이제 불러와보자

 

 

 

mysql.c 에 만들어주고

#include <stdio.h>
#include <mysql/mysql.h>

int main()
{
	MYSQL mysql;
	MYSQL_RES *myresult;
	MYSQL_ROW row;
	unsigned int num_fields;
	unsigned int num_rows;
	char*string_query;
	mysql_init(&mysql);
	mysql_real_connect(&mysql,"localhost","root","1234","test",0,NULL,0);
	string_query="select*from test \n";

	mysql_query(&mysql,string_query);
	myresult=mysql_store_result(&mysql);
	while(row=mysql_fetch_row(myresult))
		printf("%s\t%s\n",row[0],row[1]);
	mysql_free_result(myresult);
	mysql_close(&mysql);
	return 0;
}

 

 

 

설치된 경로 찾기 

 

 

 

 

패키지  찾고 

dpkg -l | grep mysql | grep dev

 

 

이름으로 검색

 

dpkg -L libmysqlclient-dev

 

 

요기 찾앗다 

 

 

 

C파일 만든곳 들어가준 다음에 

 

 

mysql.c 아까 친것이 보이네요

 

 

 

gcc mysql.c -I/usr/include/mysql/ -Wall -g -lmysqlclient -g

 

언제나 에러와 함께하지만 

당황하지 말고 경고니깐 실행은 됨

하 세그맨 테이션 오류라니!

 

 

그럼 관리자로 시작해버려

강제로 됫움 ㅎㅎ.

됫어 그럼

블로그 이미지

Or71nH

,