c언어 서버 소켓 종료 후 바로 재사용하기 (bind 실행 에러시)

프로그래밍/C, C++|2021. 2. 16. 08:07
반응형

소켓 프로그램을 만들고 사용중 종료, 재구동이 필요한 경우 소켓이 정상 종료되지 않아 (계속 사용중) 에러가 발생할때 아래와 같은 소켓 옵션 코드를 이용해 해결이 가능합니다.

 

server_fd = socket(AF_INET,SOCK_STREAM,0);

 

// 소켓 종료 후 binding 곧바로 재사용 가능하게 하기

int reuse = 1;

setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

 

이름에서 알 수 있듯이 SO_REUSEADDR 옵션이 기존 바인딩 된 주소를 재사용 할 수 있게 해줍니다.

 

반응형

댓글()

c언어 문자열 개행 제거 (두가지 방법)

프로그래밍/C, C++|2021. 2. 9. 07:35
반응형

문자열 변수를 str 이라고 했을때 아래와 같은 코드를 이용해 개행을 제거할 수 있습니다.

 

첫번째

fgets(str, strlen(str), stdin);

str[strlen(str) - 1] = '\0';

 

두번째

for (int i = 0; str[i] != 0; i++) {
    if (str[i] == '\n') {
        str[i] = 0;
        break;
    }
}

 

반응형

댓글()

c언어 문자열 치환하기

프로그래밍/C, C++|2021. 2. 8. 11:12
반응형

# replace.c

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
  
// Function to replace a string with another
// string
char* replaceWord(const char* s, const char* oldW,
                  const char* newW)
{
    char* result;
    int i, cnt = 0;
    int newWlen = strlen(newW);
    int oldWlen = strlen(oldW);
  
    // Counting the number of times old word
    // occur in the string
    for (i = 0; s[i] != '\0'; i++) {
        if (strstr(&s[i], oldW) == &s[i]) {
            cnt++;
  
            // Jumping to index after the old word.
            i += oldWlen - 1;
        }
    }
  
    // Making new string of enough length
    result = (char*)malloc(i + cnt * (newWlen - oldWlen) + 1);
  
    i = 0;
    while (*s) {
        // compare the substring with the result
        if (strstr(s, oldW) == s) {
            strcpy(&result[i], newW);
            i += newWlen;
            s += oldWlen;
        }
        else
            result[i++] = *s++;
    }
  
    result[i] = '\0';
    return result;
}
  
// Driver Program
int main()
{
    char str[] = "xxforxx xx for xx";
    char c[] = "xx";
    char d[] = "Geeks";
  
    char* result = NULL;
  
    // oldW string
    printf("Old string: %s\n", str);
  
    result = replaceWord(str, c, d);
    printf("New String: %s\n", result);
  
    free(result);
    return 0;
}



# gcc replace.c -o replace

# ./replace



반응형

댓글()

Ubuntu 18.04 부팅속도가 빨라 커널 선택창이 출력되지 않는경우

리눅스/OS 일반|2021. 2. 3. 14:38
반응형

Ubuntu 18.04 설치 후 커널 선택 화면을 보고 싶었는데 화면도 채 나오기 전에 부팅이 되어버린 경우가 있습니다.

이때는 아래 파일을 열고 색칠된 옵션을 주석처리하여 부팅이 바로되지 않도록 조정해주면 됩니다.

 

# vi /etc/default/grub

 

GRUB_DEFAULT=0

#GRUB_TIMEOUT_STYLE=hidden

#GRUB_TIMEOUT=0

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""

 

저장한 값은 아래 명령을 통해 적용 합니다.

 

# update-grub

 

 

반응형

댓글()

안드로이드 소켓 통신 (client 부분 : 데이터 송신, 수신)

반응형

네트워크 작업은 스레드를 통해서만 동작 합니다.

thread 를 구성한 후 그 안에 try, catch 를 이용해 작성합니다.

 

        Thread t = new Thread(new Thread() {

            public void run() {

                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

                StrictMode.setThreadPolicy(policy);
                StringBuffer sb = new StringBuffer();

                try {

                    InetAddress address = InetAddress.getByName("192.168.10.2"); // 서버 IP

                    Socket s = new Socket();
                    s.connect(new InetSocketAddress(address, 8888), 1000); // 서버 포트와 timeout

                    // 데이터 송신
                    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())), true);
                    out.println("Send msg"); // 전송 메세지

                    // 데이터 수신
                    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));

                    String str = null;
                    while((str = reader.readLine()) != null){
                        sb.append(str);
                    }
                    System.out.println("수신 내용 : " + sb.toString()); // 데이터를 String 형으로 출력
                    reader.close();

 

                } catch (UnknownHostException e) {

                    // nothing

                } catch (IOException e) {

                    // nothing

                } catch (Exception e) {

                    // nothing

                }

            }

        });

        t.start();

 

 

thread 안에서 toast 를 이용하여 결과를 간단히 출력하고 싶은 경우 아래 포스팅을 참고합니다.

https://sysdocu.tistory.com/1608

 

 

 

반응형

댓글()

안드로이드 Date 날짜 비교하기

반응형

 

아래와 같은 형식으로 사용합니다.

Date date1, date2;

String last_checktime = "2021-02-01 10:20:30";

String checktime = "2021-02-01 10:20:35";

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 형식은 String 과 맞추면 yyyy-MM-dd 형식도 상관없음


try {

    date1 = dateFormat.parse(last_checktime);

    date2 = dateFormat.parse(checktime);

    int compare = date1.compareTo(date2);

    if (compare < 0) { 

        // date2 가 date1 보다 큰 경우 처리할 부분

    }

} catch (ParseException e) {
    e.printStackTrace();
}

 

반응형

댓글()

스레드 (thread) 가 종료되기까지 기다리기

프로그래밍/Android (Java)|2021. 1. 26. 16:33
반응형

thread 를 사용하면 작업을 백그라운드로 돌려 호출되는 페이지의 처리속도를 높일 수 있는 장점이 있습니다.

하지만 불가피하게 소스를 순차적으로 처리해야 할 경우에는 아래와 같이 thread 를 기다렸다가 완료되면 계속 진행하도록 할 수 있습니다.


Thread t = new Thread(new Runnable() {

    @Override

    public void run() {

        // 처리할 내용

    }

});

t.start(); // thread 시작


try { 

    t.join();  // thread 종료를 기다렸다가 진행

} catch (InterruptedException e) { 

    e.printStackTrace(); 



반응형

댓글()

스레드 (thread) 안에서 toast 사용하기

프로그래밍/Android (Java)|2021. 1. 26. 14:22
반응형

우선 class 내에 아래 내용을 작성 합니다.


    public void postToastMessage(final String message) {

        Handler handler = new Handler(Looper.getMainLooper());

        handler.post(new Runnable() {

            @Override

            public void run() {

                Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();

            }

        });

    }



그다음 스레드 (thread) 안에서 아래와 같은 코드로 사용하면 됩니다.

postToastMessage("test"); // 'test' 라는 문자가 toast 로 출력



[출처] https://stackoverflow.com/questions/3134683/how-do-you-display-a-toast-from-a-background-thread-on-android



반응형

댓글()

안드로이드 스레드 (thread) 예제 - http 응답 코드 확인하기

프로그래밍/Android (Java)|2021. 1. 25. 16:35
반응형

사이트 접속 코드가 들어가면 순차 처리 도중 화면이 잠깐 멈추는 것 같은경우가 발생하여

가 되지 않고, 작업을 백그라운드로 처리하여 화면 멈춤 현상이 없어지게 됩니다.

다만 화면과 동기화 되는 toast 작업 등은 처리되지 않는것 같아, preferences 에 처리값 입력 되는 것이 감지될때 꺼내오는 식으로 처리해야 할 것 같습니다.

(toast 결과를 보려면 다시 호출)



        // pref 준비

        final SharedPreferences pref = getDefaultSharedPreferences(this);

        final SharedPreferences.Editor edit = pref.edit();


        int bb = pref.getInt("test", 0);

        Toast.makeText(getBaseContext(), "결과 코드 : " + bb, Toast.LENGTH_SHORT).show();


        // thread 내용

        t = new Thread(new Thread(){

            private int aa; // 스레드 내에서 정의된 변수는 사용시 모두 앞에 this. 를 붙여줘야 함

            private URL url;

            private HttpURLConnection connection = null;

            @Override

            public void run() {

                try {

                    this.url = new URL("http://sysdocu.tistory.com");

                    this.connection = (HttpURLConnection) this.url.openConnection();

                    this.aa = this.connection.getResponseCode(); // http 응답 코드 넣기

                } catch (IOException e) {

                    e.printStackTrace();

                    this.aa = 999; // 접속 불가시 임의의 값

                }

                edit.putInt("test", this.aa); // preferences 에 값 저장

                edit.commit();

            }

        });


        t.start();



작업이 끝나면 자연스레 종료되지만, 수동으로 종료하고자 할 경우 아래 코드를 사용합니다.


t.interrupt();




반응형

댓글()

Failed to install the following Android SDK packages as some licences have not been accepted. 에러 해결

프로그래밍/Android (Java)|2021. 1. 25. 14:39
반응형

안드로이드 스튜디오를 새로 설치한 후 기존의 프로젝트를 불러올 경우 빌드시 아래와 같은 에러 메세지가 출력될 때가 있습니다.



[에러]

Failed to install the following Android SDK packages as some licences have not been accepted.



[해결]

안드로이드 스튜디오 메뉴 File > Settings > 출력창에서 Appearance & Behavior > System Settings > Android SDK 에서


[SDK Platforms] 탭에서 필요한 버전의 플랫폼 설치하고

[SDK Tools] 탭에서 Google Play licensing Library 를 설치해 줍니다.



그리고 빌드하면 정상 처리되는 것을 볼 수 있습니다.


반응형

댓글()

리눅스 삭제된 데이터 복원하기 (extundelete)

리눅스/OS 일반|2021. 1. 25. 12:29
반응형

[환경]

Ubuntu 18.04 LTS

OS 디스크 : SSD 250G

추가 디스크 : SATA 80G



[상황]

OS 디스크 I/O error 로 인해 교체, OS 재설치가 필요하게 되었습니다.

어차피 파쇄될 디스크지만 몇몇개의 데이터 정보 유출이 우려되어 OS 디스크의 다운로드 디렉토리와 몇가지 필요없는 파일을 수동으로 삭제하며 정리하는 도중 추가 디스크의 디렉토리를 잘못 삭제하였고, 휴지통에서 조차 비워버린 상태가 되었습니다. (모든 데이터 날아감)

(중요!!) 추가 디스크의 데이터를 안전하게 보존해야 하므로 추가 디스크에 더 이상 파일을 저장하거나 쓰면 안됩니다.



[복구]

새 OS 디스크로 교체, OS 재설치 (Ubuntu 18.10) 이후 아래 명령을 이용하였습니다.


복구에 필요한 패키지를 설치합니다.


root@cdh-desktop:~# apt -y install extundelete

root@cdh-desktop:~# apt -y install e2fslibs-dev


복구될 데이터를 저장할 디렉토리로 이동합니다.


root@cdh-desktop:~# mkdir /root/restore

root@cdh-desktop:~# cd /root/restore


삭제 파일이 있는 파티션을 지정하여 복구를 시도 합니다.

(복구 대상 디스크는 마운트가 되지 않은 상태 입니다.)


root@cdh-desktop:~/restore# extundelete /dev/sdb1 --restore-all

NOTICE: Extended attributes are not restored.

Loading filesystem metadata ... 597 groups loaded.

Loading journal descriptors ... 30268 descriptors loaded.

Searching for recoverable inodes in directory / ... 

6605 recoverable inodes found.

Looking through the directory structure for deleted files ... 

6 recoverable inodes still lost.


복구가 완료 되었습니다. 오래전에 삭제한 파일도 복구가 되어 정리를 좀 해야 하지만 다른 프로그램 과는 달리 파일명도 inode 값이 아닌 사용하던 그대로 보입니다.

감격.. ㅜ.ㅜ


(복구된 용량 확인)

root@cdh-desktop:~/restore# du -sh .

36G .


(파일 리스트 보기)

root@cdh-desktop:~/restore# ll

total 12

drwxr-xr-x 3 root root 4096  1월 25 11:58 ./

drwx------ 8 root root 4096  1월 25 11:54 ../

drwxr-xr-x 4 root root 4096  1월 25 12:10 RECOVERED_FILES/

root@cdh-desktop:~/restore# cd RECOVERED_FILES/

root@cdh-desktop:~/restore/RECOVERED_FILES# ll

total 192

drwxr-xr-x 4 root root  4096  1월 25 12:10 ./

drwxr-xr-x 3 root root  4096  1월 25 11:58 ../

drwxr-xr-x 5 root root  4096  1월 25 12:05 .Trash-1000/

drwxr-xr-x 2 root root  4096  1월 25 12:10 ISOs/

-rw-r--r-- 1 root root   527  1월 25 12:10 elcplist.dll

-rw-r--r-- 1 root root 27177  1월 25 12:10 file.4726321

-rw-r--r-- 1 root root 27570  1월 25 12:10 file.4726366

-rw-r--r-- 1 root root 24823  1월 25 12:10 file.4726383

-rw-r--r-- 1 root root 25899  1월 25 12:10 file.4726390

-rw-r--r-- 1 root root 43924  1월 25 12:10 file.4726400

-rw-r--r-- 1 root root 12716  1월 25 12:10 file.4726403

root@cdh-desktop:~/restore/RECOVERED_FILES# cd .Trash-1000/

root@cdh-desktop:~/restore/RECOVERED_FILES/.Trash-1000# ll

total 20

drwxr-xr-x 5 root root 4096  1월 25 12:05 ./

drwxr-xr-x 4 root root 4096  1월 25 12:10 ../

drwxr-xr-x 3 root root 4096  1월 25 12:05 expunged/

drwxr-xr-x 6 root root 4096  1월 25 12:05 files/

drwxr-xr-x 2 root root 4096  1월 25 12:00 info/

root@cdh-desktop:~/restore/RECOVERED_FILES/.Trash-1000# ll expunged/1651618508

total 1388

drwxr-xr-x 25 root root    4096  1월 25 12:06  ./

drwxr-xr-x  3 root root    4096  1월 25 12:05  ../

drwxr-xr-x  2 root root    4096  1월 25 12:05  G클라우드/

drwxr-xr-x 11 root root    4096  1월 25 12:05  ISMS/

-rw-r--r--  1 root root   45798  1월 25 12:05 'bookmarks_19. 1. 28.html'

drwxr-xr-x  2 root root    4096  1월 25 12:05  견적서/

drwxr-xr-x  9 root root    4096  1월 25 12:05  기술지원팀/

drwxr-xr-x  3 root root    4096  1월 25 12:05  네트워크팀/

drwxr-xr-x  3 root root    4096  1월 25 12:05  매니지드팀/

drwxr-xr-x  7 root root   12288  1월 25 12:06  보고서/

drwxr-xr-x  3 root root    4096  1월 25 12:05  보안관제/

drwxr-xr-x  2 root root    4096  1월 25 12:05  서식/

drwxr-xr-x 11 root root    4096  1월 25 12:05  인프라운영팀/



반응형

댓글()