일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- JavaScript
- File
- window
- http
- 리뷰
- mutex
- Python
- API
- 영화
- install
- Callback
- package
- go
- FOR
- Sync
- Golang
- C
- windows
- GO 언어
- c++
- bitcoin
- Close
- json
- write
- go언어
- range
- Linux
- channel
- 책
- tcp
- Today
- Total
목록전체 글 (203)
Code Habit
kt 인터넷을 사용하는데 주기적으로 인터넷이 끊어지면 DHCP 갱신주기를 의심해 보아야 한다. DHCP 갱신주기 때마다 ip를 새로 할당 받기 때문에 인터넷 지연이 발생한다. 갱신주기는 다음과 같이 확인할 수 있다. 윈도우 파워쉘이나 콘솔창에서 ipconfig/all 입력 위 임대시작과 만료 일시가 너무 짧으면 넉넉히 늘려주어야 한다. 공유기를 어떤 것을 사용하느냐에 따라 임대시간 늘리는 방법이 다르다. KT 유무선 공유기 사용중인 경우 -> 인터넷 주소창에 172.30.1.254 입력하여 접속하여 아래 계정으로 로그인 한다. - 계정 : ktuser - 비밀번호 : homehub 로그인 후 다음과 같이 임대시간을 늘려준다. 장치설정 -> 네트워크 관리 -> LAN 연결 설정 -> DHCP 임대시간 수정..
CPU가 데이터를 메모리에 저장하는 방식은 다음과 같이 두 가지로 나뉜다. Big Endian : 상위 바이트의 값을 작은 번지수에 저장하는 방식 Little Endian : 상위 바이트의 값을 큰 번지수에 저장하는 방식 예를 들어 0x12345678이란 데이터를 메모리에 쓴다면 Big Endian 방식은 아래와 같이 메모리에 표시된다. 0x12 0x34 0x56 0x78 Little Endian 방식은 아래와 같이 메모리에 표시된다. 0x78 0x56 0x34 0x12 CPU에 따라 방식은 달라진다. (우리가 흔히 접하는 인텔계열 CPU는 Little Endian 방식을 사용한다.) 그래서 서로 다른 CPU끼리 데이터를 주고 받을 때 문제가 발생할 수 있다. 이 때문에 네트워크를 통해 데이터를 전송할 ..
go 언어에서 byte배열을 string으로 변환하는 방법은 여러가지 있다. 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 b := []byte{'J', 'i', 'n', 'S', 'u', 'n', 'g'} str1 := string(b[:]) str2 := fmt.Sprintf("%s", buf) str3 := bytes.NewBuffer(b).String() str4 := BytesToString(b) // func BytesToString(b []byte) string { bh := (*reflect.SliceHeader)(unsafe.Pointer(&b)) sh := reflect.StringHeader{bh.Data, bh.Len} return *(*string)(unsafe...
콜백함수는 자신의 정보가 갱신되거나 이벤트가 발생했을 때 자신을 호출하는 객체에게 알려주는 역할을 한다. 일을 맡기고 다 되었는지 수시로 확인하는 것보다 일을 하는 쪽에서 일이 완료되면 통보해주는 것이 효율적이다. 예를 들자면 우리가 밥을 지을 때 밥을 안치고 수시로 밥솥을 열어보며 밥이 다 되었는지 확인하는 것보다 밥이 완료되면 밥솥이 밥이 완료되었음을 알리는 것이 효율적이다. 이러한 개념이 적용된 것이 콜백함수라고 할 수 있다. 예제이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include typedef void(*pfCallback)(); // 콜백함수 ..
go 로 작성된 서버/클라이언트 끼리 구조체 데이터를 주고 받고 싶으면 "gob"패키지 같은 go에서 제공하는 패키지를 사용하면 편리하다. 그런데 만약 go로 서버를 만들되 클라이언트를 다른언어 ( c ) 로 만들게 되면 위와 같은 패키지는 사용할 수 없게 된다. 이렇게 되면 문제가 하나 발생하는데 go에서는 포인터 개념도 없고, 문자열을 표현하는 string 자료형이 가변이라 약속된 크기의 데이터를 주고 받기가 꽤 까다롭다는 것이다. 그래서 필자는 아래와 같은 두가지 방법을 생각해 보았다. 1. 사이즈 전송 후 구조체 데이터를 json데이터로 전송 2. 사이즈 전송 후 구조체 데이터의 각 필드를 고정된 크기의 []byte형으로 전송 네트워크 통신에서 (특히 http 통신)에서 많이 사용하는 json 데..
앞에서 go를 이용한 TCP ehco 서버/클라이언트를 만들어 보았는데, 구현에 문제점이 있다고 지적하였었다. TCP 통신은 원래 데이터간의 경계가 존재 하지 않는다. 즉 네트워크나 PC 상황에 따라 데이터 전송이 밀려 자칫 데이터 전송이 의도치 않게 될수 있다는 것이다. 그래서 이를 보완하기 위해 본 데이터를 전송하기 전에 미리 전송되는 데이터의 size를 알려줘 데이터 전송에 오차가 없도록 할 수 있다. 참 다행히도 TCP 통신은 데이터의 무결성을 보장하기 때문에 전송하는 데이터가 중간에 유실될 염려는 하지 않아도 된다. 다음은 예제 코드이다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 func Co..
go를 이용하여 간단한 tcp echo 서버/클라이언트를 만들어 보겠다. server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 // main.go package main import ( "io" "log" "net" ) func main() { l, err := net.Listen("tcp", ":8000") if nil != err { log.Println(err) } defer l.Close() for { conn, err := l.Accept() if nil != err { ..
std::erase 함수는 해당 인덱스의 데이터를 지우고 그 뒤에 있는 데이터를 남은 자리만큼 앞으로 이동시킨다. 그러므로 자료구조를 순차적으로 탐색하여 원하는 인덱스에 erase를 사용할 땐 주의가 필요하다. 예를 들어보자. 1 2 3 4 5 6 7 8 9 10 11 vector vec; vector::iterator it; for(it = vec.begin(); i != vec.end(); ) { if (삭제의 조건문) { it = vec.erase(it); } else { it++; } } erase함수로 지우면 한칸씩 앞으로 당겨지기 때문에 지우지 않을 때만 it++를 해준다. 해당 iterator의 요소를 삭제해버리면 그 iterator는 무효화가 된다. it값이 사라져버리는 것이다. 다행히도 ..