프로그래밍 QnA

marionette10의 이미지

ip 송신지 주소에 마스크 씌우는 법

현재 패킷의 ip 헤더를 가져와서

ip 송신지 주소에 마스크를 씌워서

XXX.XXX.0.0 해서 192.168.0.0 과 같으면 이라는 if문 조건으로 프로그래밍을 하고 싶은데

어떻게 마스크를 씌우죠?

unsigned long networkclass=INET_ADDR("192.168.0.0");
unsigned long ipaddr = 0, network = 0, mask = INET_ADDR("255.255.0.0");
char *str, *str2;

eth_hdr = (eth_hdr_t *) (data);
memcpy(&ip_hdr, (data + LIBNET_ETH_H), LIBNET_IP_H);

node->ip = ip_hdr.ip_src.s_addr;
mask = ~0;
mask = mask >> 16;
ipaddr = node->ip & mask;

vani2의 이미지

c++ enum 스코프 관련

다음 코드를(일부생략)VS2013에서 컴파일하면 잘 되는데 G++(C++11)에서 컴파일 하면 오류가 나네요.

enum AP
{
  A, B, C
};
 
void main(void)
{
    cout << AP::A; // G++에선 오류, VC에선 정상
}

enum에 태그를 달더라도 스코프 지정이 불가능하기 때문에 보완을 위해 C++0x에서 enum class가 나왔다고 알고있는데요,

VC에서 실험해 보았을때 enum class도 아닌데 일반 enum이 스코프 지정이 가능 하네요.

이건 VC가 확장으로 지원하는 기능인가요? 표준은 아니지요?

hiluciano의 이미지

어셈블리어에서 int 21h-02h로 문자열을 출력하는 건데요

.data
message "Hello, World", 0
.code
main proc
mov bx, offset message ; message의 주소값
mov cx, 0 ; 인덱스 값

main_loop:
mov ax, 02h ; 한 글자씩 출력하기
mov dx, bx ; message[cx]의 문자를 dl로 옮기기
add dx, cx
mov dl, [dx]
int 21h; 한 글자씩
inc cx ;인덱스변수 값증가

cmp dx, 0 ; 방금 출력한 문자가 널문자?
jne main_loop ; 아니면 널문자 나올때까지반복

mov ah, 4ch ; 종료
int 21h
main endp
end main

어셈블리어를 이제 막 배우는 중인데요
한 글자씩 널문자 아닐때까지 출력하는 코드를 만들어 봤습니다

ind6450의 이미지

jsp와 자바클래스를 이용하여 이클립스로 간단한 야구게임을 만드는 프로그램 질문좀요ㅠ

1. 클라이언트 브라우저에서 새 게임 버튼을 클릭하여 게임 상태를 초기화 한다.
- 이 단계에서 서버는 Java 언어의 Math.random()메소드를 이용하여 임의의 세 숫자를
결정한다.
2. 클라이언트 브라우저에서 임의의 세 숫자를 결정 후 서버에 전송한다.
3. 서버에서는 전송 받은 세 개의 숫자와 1단계에서 결정한 세 개의 숫자를 비교한다.
① 클라이언트로부터 전송 받은 세 개의 숫자와 서버에서 결정 해 놓은 세 숫자의 개수가 하나도 일치하지 않을 때 스트라이크 아웃이 되고 게임은 진다.
② 한 개만 맞고 두 개가 틀릴 때 1 Ball, 2 Strike로 카운트 된다.
③ 두 개만 맞고 한 개가 틀릴 때 2 Ball, 1 Strike로 카운트 된다.
④ 세 개가 다 맞을 경우 안타를 치면서 게임에 승리한다.
4. 3 단계에서 ① 또는 ④가 아니면 단계 2로 간다. 그런 다음 단계 3에서 이전 카운트를 고려하여 서버에서 결정해 놓은 3개의 숫자를 추정한다.

lomiet의 이미지

Linux에서 Socket write 할 때 발생하는 EAGAIN 을 어떻게 처리하나요?

예를 들어 300 바이트짜리 패킷을 Socket에 write 하는데, EAGAIN이 발생을 합니다.

기존 시스템은 Solaris이고, Solaris에서는 300byte를 다 쓰지 못할 것 같으면, EAGAIN을 발생시키고 넘어가는데,
Linux에서는 일부(예를 들어 200byte)를 쓸 수 있으면 쓰고, error를 발생시키지 않네요. 그 다음번부터 EAGAIN이 나는데....

어찌 처리할까 고민하다가, 써야할 데이터 크기와 실제로 씌여진 데이터의 크기를 비교해서 씌여진 데이터 크기가 작다면 다 씌여질 때까지 처리를 해주면 되겠구나 생각을 했는데,,, 이게 난관에 봉착을 한 게,

한 프로세스가 복수의 단말에 데이터를 쓰다 보니, 한 단말에서 EAGAIN이 해소되지 않으면, 그동안 다른 단말에도 서비스할 수가 없겠더라구요.

해서 든 생각이 쓰기 전에 300 바이트를 다 쓸 수 있을지 여부를 알 수 있으면 되겠다 싶습니다.(쓸만하면 쓰고, 못 쓸 것 같으면 일단 패쓰하고 다른 단말을 처리한 후 다음 차례에 다시 시도하면 될 것 같습니다.)

Gwondori의 이미지

pthread 속성 관련 함수인 setschedpolicy에 대한 질문입니다.

만일 pthread_t *tid; 를 선언한 뒤 여러 쓰레드를 만들려고 하는데 여기서 thread끼리의 스케쥴링를 적용할려고 하면

pthread_attr_setschedpolicy를 사용하면 된다네요...

그렇다면 만일 thread_attr_setschedpolicy를 사용하여 FIFO를 적용한다하면
(pthread_attr_setschedpolicy(&attr, SCHED_FIFO);)

정말로 FIFO대로 작동하는지요...?

아니면 부가설정도 필요하다면 어떤 부가설정을 하면되고, 또 위와같이 적용한다면 그 한계는 어떤지요..

엄청 궁금합니다.

PS. 실제로 제가 pthread_self()를 통하여 직접 해보긴했으나 이렇게 해서 평가하는게 맞는지 모르겠네요.

일단 결과값은 총 thread 10개를 만든 뒤, pthread_create()를 하여

runnable함수로부터 출력하도록 하니 3 4 5 6 7 8 9 0 1 2 이 순서로 떳습니다.

nookied의 이미지

[질문] 리눅스 가상-물리 메모리 매핑 관련(Normal Zone)

안녕하세요..! 현재 저는 x86기반 리눅스를 공부하고 있습니다.

가상 메모리와 물리메모리 매핑관련해서 공부중인데요, 궁금한 것이 잇는데
정보를 찾아볼 수 없어 이렇게 질문을 올립니다!

x86기반 리눅스에서는 가상메모리 영역의 0xC0000000부터 +896MB까지가

물리메모리 0x00000000~896MB로 1:1 Direct Mapping된다고 많은 서적과 인터넷 자료에 나와잇습니다.

그리고 이부분이 Normal zone이라는 것도 알겟고,
그래서 커널에서는 C0000000~+896MB사이의 가상메모리 주소는 (메모리주소 - 0xC0000000)으로
물리메모리주소를 쉽게 구한다고 알고 있습니다.

하지만, cpu는 사실 이러한 사실을 모르고 mmu를 통해 변환하게
될텐데요, 그럼 결국 page table에서도 1:1 매핑을 일일히 다 해주어야 하지 않나요??

2 level page table 기법을 쓰게된다면 가상메모리주소의
상위 10bit이 pgd 인덱스고 다음 10bit이 pte 인덱스일텐데요,

raphael4의 이미지

iptables 컴파일 에러 도무지 모르겠습니다

extensions/libipt_REJECT.c In function 'parse';
extenstions/libipt_REJECT.c:116:error: label at end of compound statement

iptables1.2 버전 컴파일 하는데 위와 같이 에러가 나옵니다

make KERNEL_DIR=/home/linux-2.6.30.1

이렇게 make 하고

커널에 iptables 관련 사항 다 넣고 빌드 했습니다

저 에러는 구글링 해도 전혀 정보가 없더군요

조금이나마 힌트라도 부탁드립니다.

cococo의 이미지

mysql_free_result() 를 해 주지 않아도 OS 나 DB 에서 garbage collect 해 주나요?

linux + mysql + c++ 로 프로그램을 작성했는데 계속 죽어서 디버그 넣고 확인해 보다가,

SELECT QUERY 를 실행한 다음 mysql_free_result() 로 select 결과를 해제해 주지 않은 걸 알게 되었습니다.

뒤늦게 넣기는 했는데... 수정하기 이전의 select 작업들은, 메모리가 해제되지 않고 남아있지 않는가 하는게 걱정됩니다.

C++ 로 컴파일한 코드에서, mysql DB에서 select 한 결과를 free 하지 않고 프로그램을 종료했을 때, 혹시 OS 혹은 DB에서 나머지 메모리를 해제해 줄까요?
아니면 인위적으로 해제해 줄 수 있는 방법이 존재할까요?

혹시 비슷한 경우를 겪으신 분이 있다면, 의견 주시면 감사하겠습니다.

이상입니다. 좋은 하루 되시기 바랍니다.

hs6959의 이미지

Random Number Generator로 data(1~1000000까지 정수)를 발생

Random Number Generator로 data(1~1000000까지 정수)를 발생시키라는데
이건 도대체 어떻게 해야되죠?
간단한 코드일것같은데 서핑해도 답이 없네요ㅠㅠ

페이지

프로그래밍 QnA 구독하기