Linux API/network2009. 6. 18. 21:19
아래의 소스에서 눈여겨 볼 부분은 다음과 같다.
    struct ifreq *ifr;
    struct ifconf ifcfg;

    ioctl(fd, SIOCGIFCONF, (char *)&ifcfg);

    // 네트워크 장치의 정보를 얻어온다. 
    // 보통 루프백과 하나의 이더넷 카드를 가지고 있을 것이므로
    // 2개의 정보를 출력할 것이다.

    ifr = ifcfg.ifc_req;
    for (n = 0; n < ifcfg.ifc_len; n+= sizeof(struct ifreq))
    {
        // 주소값을 출력하고 루프백 주소인지 확인한다.
        printf("[%s]\n", ifr->ifr_name);
        sin = (struct sockaddr_in *)&ifr->ifr_addr;
        printf("IP    %s %d\n", inet_ntoa(sin->sin_addr), sin->sin_addr.s_addr);
        if ( ntohl(sin->sin_addr.s_addr) == INADDR_LOOPBACK)
        {
            printf("Loop Back\n");
        }
        else
        {
            // 루프백장치가 아니라면 MAC을 출력한다.
        }
        ifr++;
    }

ifr은 struct ifreq인데, 여러개가 있을 수 있으니, 저런식으로 포인터로 증가를 시켜준다. (ifr++)
그리고 n개의 네트워크 장치가 있을 수 있으니, ifcfg.ifc_len의 값으로 전체 갯수를 알려준다.
그 다음에는 장치명(익숙한 eth0 라던가)은 ifr->ifr_name에 들어있다.

#include "sys/ioctl.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "sys/socket.h"
#include "unistd.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "net/if.h"
#include "arpa/inet.h"

int main()
{
    // 이더넷 데이터 구조체 
    struct ifreq *ifr;
    struct sockaddr_in *sin;
    struct sockaddr *sa;

    // 이더넷 설정 구조체
    struct ifconf ifcfg;
    int fd;
    int n;
    int numreqs = 30;
    fd = socket(AF_INET, SOCK_DGRAM, 0);

    // 이더넷 설정정보를 가지고오기 위해서 
    // 설정 구조체를 초기화하고  
    // ifreq데이터는 ifc_buf에 저장되며, 
    // 네트워크 장치가 여러개 있을 수 있으므로 크기를 충분히 잡아주어야 한다.  
    // 보통은 루프백주소와 하나의 이더넷카드, 2개의 장치를 가진다.
    memset(&ifcfg, 0, sizeof(ifcfg));
    ifcfg.ifc_buf = NULL;
    ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
    ifcfg.ifc_buf = malloc(ifcfg.ifc_len);

    for(;;)
    {
        ifcfg.ifc_len = sizeof(struct ifreq) * numreqs;
        ifcfg.ifc_buf = realloc(ifcfg.ifc_buf, ifcfg.ifc_len);
        if (ioctl(fd, SIOCGIFCONF, (char *)&ifcfg) < 0)
        {
            perror("SIOCGIFCONF ");
            exit;
        }
        // 디버깅 메시지 ifcfg.ifc_len/sizeof(struct ifreq)로 네트워크 
        // 장치의 수를 계산할 수 있다.  
        // 물론 ioctl을 통해서도 구할 수 있는데 그건 각자 해보기 바란다.
        printf("%d : %d \n", ifcfg.ifc_len, sizeof(struct ifreq));
        break;
    }

    // 주소를 비교해 보자.. ifcfg.if_req는 ifcfg.ifc_buf를 가리키고 있음을 
    // 알 수 있다. 
    printf("address %d\n", &ifcfg.ifc_req);
    printf("address %d\n", &ifcfg.ifc_buf);

    // 네트워크 장치의 정보를 얻어온다.  
    // 보통 루프백과 하나의 이더넷 카드를 가지고 있을 것이므로 
    // 2개의 정보를 출력할 것이다. 
    ifr = ifcfg.ifc_req;
    for (n = 0; n < ifcfg.ifc_len; n+= sizeof(struct ifreq))
    {
        // 주소값을 출력하고 루프백 주소인지 확인한다.
        printf("[%s]\n", ifr->ifr_name);
        sin = (struct sockaddr_in *)&ifr->ifr_addr;
        printf("IP    %s %d\n", inet_ntoa(sin->sin_addr), sin->sin_addr.s_addr);
        if ( ntohl(sin->sin_addr.s_addr) == INADDR_LOOPBACK)
        {
            printf("Loop Back\n");
        }
        else
        {
            // 루프백장치가 아니라면 MAC을 출력한다.
            ioctl(fd, SIOCGIFHWADDR, (char *)ifr);
            sa = &ifr->ifr_hwaddr;
            printf("%s\n", ether_ntoa((struct ether_addr *)sa->sa_data));
        }
        // 브로드 캐스팅 주소 
        ioctl(fd,  SIOCGIFBRDADDR, (char *)ifr);
        sin = (struct sockaddr_in *)&ifr->ifr_broadaddr;
        printf("BROD  %s\n", inet_ntoa(sin->sin_addr));
        // 네트워크 마스팅 주소
        ioctl(fd, SIOCGIFNETMASK, (char *)ifr);
        sin = (struct sockaddr_in *)&ifr->ifr_addr;
        printf("MASK  %s\n", inet_ntoa(sin->sin_addr));
        // MTU값
        ioctl(fd, SIOCGIFMTU, (char *)ifr);
        printf("MTU   %d\n", ifr->ifr_mtu);
        printf("\n");
        ifr++;
    }
}

[링크 : http://www.joinc.co.kr/modules.php?file=article&mode=nested&name=News&sid=148]
Posted by 구차니
Linux2009. 6. 18. 21:15
Posted by 구차니

#include "stdio.h"
#include "elf.h"

void main() { Elf32_Ehdr elf_header; unsigned char magic[] = {0x7f,0x45,0x4c,0x46,0x01,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; int vma_addr = 0xA4000000; FILE *output = NULL;
memcpy(elf_header.e_ident, magic, sizeof(magic)); elf_header.e_type = ET_EXEC; elf_header.e_machine = EM_SH; elf_header.e_version = EV_CURRENT; elf_header.e_entry = vma_addr; elf_header.e_phoff = 0; elf_header.e_shoff = 0; elf_header.e_flags = EM_SH; elf_header.e_ehsize = sizeof(elf_header); elf_header.e_phentsize = 0; elf_header.e_phnum = 0; elf_header.e_shentsize = 0; elf_header.e_shnum = 0; elf_header.e_shstrndx = 0;
output = fopen("elfheader.bin","wb"); fwrite(&elf_header, sizeof(Elf32_Ehdr), 1, output); fclose(output);
}

혹시나 해서 꼼지락 대면서 gdb load 명령을 이용하여 프로그램 업로드 하기 위해
꽁수를 부려 봤는데.. 이정도 ELF 정도로는 속아주질 않는다 ㄱ-

아이디어 : load 시에 not an object file: File format not recognized 메시지는
               즉, ELF 포맷에 맞추어 제대로 된 헤더만 맞추어 주면
               원하는 메모리 번지로 임의의 파일을 올릴 수 있지 않을까?

결과 : 니미 ㄱ-

2009/02/16 - [회사일] - sh4-linux-gdb 의 load 명령어

'프로그램 사용 > gdb & insight' 카테고리의 다른 글

GDB Insight FAQ - support target list  (0) 2009.06.26
insight - GDB GUI frontend  (0) 2009.06.26
gdb 한글 문서  (0) 2009.06.18
gdb 기동시 xterm 에러 - STLinux  (2) 2009.04.09
sh4-linux-gdb 의 load 명령어  (0) 2009.02.16
Posted by 구차니
개소리 왈왈2009. 6. 18. 16:49
Posted by 구차니
Posted by 구차니
개소리 왈왈2009. 6. 18. 13:23
예비군 훈련이 19일 있습니다

















만, 멀어서 땡땡이 치고 다음이 보충을 받기고 했습니다!!!!!!






Posted by 구차니
회사일2009. 6. 18. 11:40
현재 사용하는 것은 모델명 알 수 없는 AXIS AX88172 모델이다.
아무튼, STLinux 에서 지원되는 모델은 AX88172 은 확실하고(그런데 거의 단종)
그 외에는 driver/usb/net/asix.c 에서 지원되는 목록중에

ax88772 가 있다.
어느 쪽 정보가 확실한지는 모르겠지만
어스비테크놀러지의 IAE-2200(모델명 UE-200)가 XP 드라이버를 보니 ax88772를 사용한다고 나온다.

2009.06.19 일 테스트 결과 어스비테크놀러지의 IAE-2200 작동한다.
(칩셋명 ASIX ax88772 - linux 커널 내장 USB 네트워크 드라이버 ASIX ax8xxxx 드라이버 호환됨)

This option adds support for ASIX AX88xxx based USB 2.0 10/100 Ethernet adapters.

This driver should work with at least the following devices:
* Aten UC210T
* ASIX AX88172
* Billionton Systems, USB2AR
* Buffalo LUA-U2-KTX
* Corega FEther USB2-TX
* D-Link DUB-E100
* Hawking UF200
* Linksys USB200M
* Netgear FA120
* Sitecom LN-029
* Intellinet USB 2.0 Ethernet
* ST Lab USB 2.0 Ethernet
* TrendNet TU2-ET100

[링크 : http://cateee.net/lkddb/web-lkddb/USB_NET_AX8817X.html]

'회사일' 카테고리의 다른 글

리셋 타이밍은 지켜주세요!  (0) 2009.06.30
mpeg-2 Transport Stream packet analyser  (0) 2009.06.24
CBM - CuBic Meter  (0) 2009.06.16
SH4 linux 에서 SH가 뭥미?  (2) 2009.06.08
MAC Address도 구매 가능한가요?  (0) 2009.06.02
Posted by 구차니
키보드로 입력할 때에는
메시지는 WM_KEYDOWN / WM_KEYUP 와 버츄얼 키는 VK_RETURN이 입력된다.

하지만 바코드로 입력할 때에는
메시지는 WM_CHAR / 버츄얼 키는 VK_RETURN 이 입력된다.


어떤 차이로 인해서 이렇게 다르게 인식을 하는지는 모르겠다...

[참고 : http://msdn.microsoft.com/en-us/library/ms646267(VS.85).aspx]
[참고 : http://web.lge.cn:8000/system/api/1241/page/3]

'모종의 음모 > 바코드 리더' 카테고리의 다른 글

바코드 리더 관련 프로그래밍 힌트  (0) 2009.06.22
바코드 폰트 (code 39)  (0) 2009.06.15
barcode reader - PS/2 type  (2) 2009.06.12
Posted by 구차니
Programming/C Win32 MFC2009. 6. 17. 16:26
PreTranslateMessage() 는, 키를 먼저(Pre) 해석해서 처리하는 메소드이다.
아래의 내용처럼, 내부에서 처리할 것 들 다 처리하고

return TRUE;
를 할 경우에는 0이 아닌 값이므로, 더 이상 처리하지 않고,

return FALSE;
일 경우에는 0이므로 계속 처리를 하도록 한다.

Return Value
Nonzero if the message was translated and should not be dispatched;
0 if the message was not translated and should be dispatched.

[링크 : http://msdn.microsoft.com/en-us/library/kkbhxcs2(VS.80).aspx]

[발견 : http://a.tk.co.kr/252]
Posted by 구차니
Programming/C Win32 MFC2009. 6. 17. 14:58
char 형의 변수를
Format("%02X");
로 출력을 했더니 0xFFFFFFFF 이런식으로 출력이된다. OTL
내가 원한건 0xFF 이런식!


해결책 : char 형 변수를 BYTE로 선언해준다.
            BYTE는 unsigned char 형으로 선언되어 있고, 이로 인해 의도한대로 출력이 될 것이다.

[링크 : http://kuaaan.tistory.com/58]
Posted by 구차니