Linux API/joystick2012. 2. 4. 14:37
CCTV(PTZ) 업체에 있다 보니 리눅스에서도 조이스틱을 이용해서
컨트롤러를 대체할수 있을까 라는 생각에 조이스틱 관련 API를 찾아보는데
의외로 단순한 구조 같은 느낌..

요즘에는 USB로도 많이 쓰니 USB목록에서 장치명을 찾아서 열거하는 것도 필요할 듯 하고
아무튼 중요한건 js_event 구조체 이녀석인듯.
int fd = open ("/dev/js0", O_RDONLY);
struct js_event e;
read (fd, &e, sizeof(struct js_event));

struct js_event {
__u32 time;     /* event timestamp in milliseconds */
__s16 value;    /* value */
__u8 type;      /* event type */
__u8 number;    /* axis/button number */
}; 

[링크 : http://www.mjmwired.net/kernel/Documentation/input/joystick-api.txt] 3.2 kernel
[링크 :  http://archives.seul.org/linuxgames/Aug-1999/msg00107.html] 2.2 kernel

----
curse.h가 없다고 에러날 경우는 아래와 같이 설치해주고
$ sudo apt-get install libncurses5-dev  

소스는 이런식으로 수정하고 컴파일을 하면된다.
#define JOY_DEV "/dev/input/js0"  

#include "pthread.h"
#include "sys/timeb.h"
#include "curses.h"
#include "fcntl.h"
#include "linux/joystick.h"

#define NUM_THREADS	3
#define JOY_DEV		"/dev/input/js0"
#define HZ				12

const char FILENAME[] = "./joystickLog.out";
char axisDesc[15][5] = {"X", "Y", "Z", "R", "A", "B", "C", "D", "E", "F", "G", "H", "I" };
char numAxis[20], numButtons[20], value[20][20], timeSec[20], timeMilli[20];
int num_of_axis;

void write_to_log(){
	sleep(1);
	int cnt;
	FILE * daFile;
	daFile = fopen(FILENAME, "w+");

//	WRITE A HEADER ON THE OUPUT FILE
	fprintf(daFile, "#,");
	for(cnt = 0; cnt < num_of_axis; cnt++)
		if(cnt < num_of_axis -1)	fprintf(daFile, "%s,", axisDesc[cnt]);
		else								fprintf(daFile, "%s", axisDesc[cnt]);
	fprintf(daFile, "\r\n");

	while(1){
		fprintf(daFile, "%s.%s, ", timeSec, timeMilli);
		for(cnt = 0; cnt < num_of_axis; cnt++){
			if(cnt < num_of_axis -1)	fprintf(daFile, "%s, ", value[cnt]);
			else								fprintf(daFile, "%s ", value[cnt]);
		}
		fprintf(daFile, "\r\n");
		usleep(83333);
	}
	
	fprintf(daFile, "%s.%s Len = %d ", timeSec, timeMilli,strlen(timeMilli));

	fprintf(daFile, "\r\n");
	fflush(daFile);
}

void write_to_screen(){
	struct timeb seconds;
	int cnt, joy_fd, *axis=NULL, num_of_buttons=0, x;
	char *button=NULL, name_of_joystick[80];
	struct js_event js;
	time_t theTime;

	wmove(stdscr, 8, 0);
	addstr("Type \"q\" to quit.\n");

	if( ( joy_fd = open( JOY_DEV , O_RDONLY)) == -1 ){
		wmove(stdscr, 3,0);
		addstr( "Couldn't open joystick " );
		addstr( JOY_DEV );
		wmove(stdscr, 10,0);
		while(1)usleep(16666);
	}

	ioctl( joy_fd, JSIOCGAXES, &num_of_axis );				//	GET THE NUMBER OF AXIS ON JS
	ioctl( joy_fd, JSIOCGBUTTONS, &num_of_buttons );		//	GET THE NUMBER OF BUTTONS ON THE JS
	ioctl( joy_fd, JSIOCGNAME(80), &name_of_joystick );	//	GET THE NAME OF THE JS

	axis = (int *) calloc( num_of_axis, sizeof( int ) );
	button = (char *) calloc( num_of_buttons, sizeof( char ) );

	sprintf(numAxis, "%d", num_of_axis);
	sprintf(numButtons, "%d", num_of_buttons);

	wmove(stdscr, 0,0);
	addstr("Joystick detected: ");

	wmove(stdscr, 0, 19);
	addstr(name_of_joystick);

	wmove(stdscr, 1, 0);
	addstr("Number of axis   :");

	wmove(stdscr, 1, 19);
	addstr(numAxis);
	
	wmove(stdscr, 2, 0);
	addstr("Number of buttons:");

	wmove (stdscr, 2, 19);
	addstr(numButtons);

//	CHANGE THE STATUS FLAG OF THE FILE DESCRIPTOR TO NON-BLOCKING MODE
	fcntl( joy_fd, F_SETFL, O_NONBLOCK );   

	while( 1 ){
		usleep(16666);
	
	//	READ THE JOYSTICK STATE, IT WILL BE RETURNED IN THE JS_EVENT STRUCT
		read(joy_fd, &js, sizeof(struct js_event));

	//	GET THE NUMBER OF SECONDS SINCE EPOCH
		ftime(&seconds);
		theTime = time(NULL);
		sprintf(timeSec, "%d", seconds.time);						
		sprintf(timeMilli, "%d", seconds.millitm);
               
	//	CHECK THE EVENT
		switch (js.type & ~JS_EVENT_INIT){
			case JS_EVENT_AXIS:
				axis   [ js.number ] = js.value;
				break;
			case JS_EVENT_BUTTON:
				button [ js.number ] = js.value;
				break;
		}
		//	ADD LEADING 0'S TO THE MILLISECOND STRING (IF NECESSARY)
			char temp[10] = "";
			while(strlen(temp) < (3 - strlen(timeMilli)))
				strcat(temp, "0");
			strcat(temp,timeMilli);
			strcpy(timeMilli, temp);

		//	PRINT THE RESULTS
			wmove(stdscr, 4, 0);
			for(cnt = 0; cnt < num_of_axis; cnt++)
				addstr("            ");
			for(cnt = 0; cnt < num_of_axis && cnt < 13; cnt++){
				sprintf(value[cnt], "%d", axis[cnt]);
				wmove(stdscr, 4, cnt * 10);
				addstr(axisDesc[cnt]);
				addstr(": ");
				wmove(stdscr, 4, (cnt * 10) + 2);
				addstr(value[cnt]);
			}
			
			wmove(stdscr, 6, 0);
			addstr(timeSec);
			wmove(stdscr, 6,10);
			addstr(".");
			wmove(stdscr, 6, 11);
			addstr(timeMilli);
			wmove(stdscr, 6, 15);
			addstr("=");
			wmove(stdscr, 6, 17);
			addstr(ctime(&theTime));
                       
			wmove(stdscr, 10, 0);
			refresh();
	}
}

void *ThreadProcs(void *threadid){
	int thread_id = (int)threadid;
	
	if(thread_id == 0){
		write_to_screen();
	}
	
	if(thread_id == 1){
	//	THIS THREAD WILL MAKE THE PROGRAM EXIT
		int ch;
		nodelay(stdscr, TRUE);				//	SETUP NON BLOCKING INPUT
		while(1) {
			if ((ch = getch()) == ERR) usleep(16666);		//	USER HASN'T RESPONDED
			else if( ch == 'q'){			
				endwin();
				exit(0);			//	QUIT ALL THREADS
			}
		}
	}
	if(thread_id == 2){
		write_to_log();
	}
}

int main(int argc, char *argv[]){
	initscr(); 									//	INIT THE SCREEN FOR CURSES
	pthread_t threads[NUM_THREADS];
	int rc, t;
	for(t = 0; t < NUM_THREADS; t++){	//	MAKE 2 NEW THREADS
		rc = pthread_create(&threads[t], NULL, ThreadProcs, (void *)t);
		if (rc){
			printf("ERROR; return code from pthread_create() is %d\n", rc);
			exit(-1);pthread_exit(NULL);
		}
	}
	
	for(t = 0; t < NUM_THREADS; t++)
		pthread_join(threads[t], NULL);		//	WAIT FOR THREADS TO EXIT OR IT WILL RACE TO HERE.

	endwin();
	return 0;
}


[링크 : http://www.linuxquestions.org/questions/programming-9/joystick-347292/]
 + [링크 : http://sukwoo.blogspot.com/2008/07/ubuntu-804-ncurses.html]
---
[링크 : http://msdn.microsoft.com/en-us/library/windows/desktop/dd743596(v=vs.85).aspx] << 윈도우용

'Linux API > joystick' 카테고리의 다른 글

linux force feedback  (0) 2022.06.15
linux/joystick.h 파일  (0) 2012.02.05
Posted by 구차니
Linux API/network2011. 11. 7. 23:30
아따 여러단계로 해놨네 -_-
route 라던가 ifconfig 등의 소스를 받을수 있는 링크이다.
binutils에 속해있을 줄 알았는데 별도의 소스일줄이야...

[링크 : http://net-tools.berlios.de/]
[링크 : http://net-tools.sourceforge.net/]
[링크 : http://sourceforge.net/projects/net-tools/]

'Linux API > network' 카테고리의 다른 글

linux socket 관련  (0) 2015.01.22
멀티캐스트 되는지 여부 확인  (0) 2014.11.21
INADDR_ANY/INADDR_BROADCAST/INADDR_NONE 매크로  (0) 2011.09.29
hton(), ntoh()  (0) 2011.09.26
netstat 에서 0.0.0.0의 의미  (2) 2009.12.07
Posted by 구차니
Linux API/network2011. 9. 29. 18:05
/usr/include/netinet/in.h

176 /* Address to accept any incoming messages.  */
177 #define INADDR_ANY      ((in_addr_t) 0x00000000)
178 /* Address to send to all hosts.  */
179 #define INADDR_BROADCAST    ((in_addr_t) 0xffffffff)
180 /* Address indicating an error return.  */
181 #define INADDR_NONE     ((in_addr_t) 0xffffffff) 

hton() 과 같은 변환없이 사용해도 되는 매크로인데
255.255.255.255(BROADCAST/NONE) 혹은 0.0.0.0(ANY) 으로 치환이 된다.

'Linux API > network' 카테고리의 다른 글

멀티캐스트 되는지 여부 확인  (0) 2014.11.21
net tools 소스코드  (0) 2011.11.07
hton(), ntoh()  (0) 2011.09.26
netstat 에서 0.0.0.0의 의미  (2) 2009.12.07
ioctl을 이용한 정보수집  (0) 2009.11.30
Posted by 구차니
Linux API/network2011. 9. 26. 15:38
프로그래밍을 하다보면 짜증나는 것 중에 하나가 바로 이넘의 Byte Order이다.
Intel CPU가 Little Endian 이다 보니 Big Endian 과 유사한 비트 스트림의 경우에는
순서를 죄다 뒤집어주어야 한다. (어셈블러로 그냥 이런 명령어 하나 좀 만들어 주지 -_-)

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

The htonl() function converts the unsigned integer hostlong from host byte order to network byte order.
The htons() function converts the unsigned short integer hostshort from host byte order to network byte order.

The ntohl() function converts the unsigned integer netlong from network byte order to host byte order.
The ntohs() function converts the unsigned short integer netshort from network byte order to host byte order.

On the i80x86 the host byte order is Least Significant Byte first, whereas the network byte order, as used on the Internet, is Most Significant Byte first.
 
[링크 : http://linux.die.net/man/3/htonl

머.. 정리 하자면
hton 은 ip 주소를 보낼때
ntoh 는 ip 주소를 받았을때 사용하면 될듯? 
Posted by 구차니
Linux API/network2009. 12. 7. 13:42
0.0.0.0 은 간단하게 all allow의 의미라고 한다.







MS 넘들은 뻑하면 "의도된 설계입니다"
이 한마디로 구렁이 담 넘어 가듯 넘어간단 말이야 ㄱ-

The Winsock application that is listening on the designated port was written so that it binds to any local IP address by using INADDR_ANY. This means that the application will listen to all local interfaces and you can connect to the port of any of them. This is why netstat -an shows IP address 0.0.0.0 listening on the port.

[링크 : http://support.microsoft.com/?scid=kb%3Ben-us%3B175952&x=6&y=11]



-------------
$ netstat -an | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:674                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:139                 0.0.0.0:*                   LISTEN

$ netstat -a | more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 *:nfs                       *:*                         LISTEN
tcp        0      0 *:acap                      *:*                         LISTEN
tcp        0      0 *:netbios-ssn               *:*                         LISTEN

리눅스 상에서는 0.0.0.0 은 *로 표시 되기도 한다.
(-n 옵션은 numeric하게 출력할지 아니면 /etc/services 의 문자열로 출력할지를 결정하는 옵션이다)

'Linux API > network' 카테고리의 다른 글

INADDR_ANY/INADDR_BROADCAST/INADDR_NONE 매크로  (0) 2011.09.29
hton(), ntoh()  (0) 2011.09.26
ioctl을 이용한 정보수집  (0) 2009.11.30
termios 구조체를 이용한 자국반향(echo) 제어  (0) 2009.08.27
canonical / non-canonical  (0) 2009.08.27
Posted by 구차니
Linux API/v4l2009. 12. 6. 19:41
  [CAMEL PC-100 : http://blog.danawa.com/prod/?prod_c=956003]
  [더불정보기술 X-LUK DBC-UP : http://blog.danawa.com/prod/?prod_c=911980]

위에 두녀석을 다시 꼽아 보니 둘다 video0가 생성이 된다.
CAMEL PC-100은 내장 마이크/사운드 장치가 있고
X-LUK DBC-UP은 내장 마이크 조차 없는 녀석이다(단지 PC용 monitor 프로그램이 있어서 산것일뿐 ㄱ-)

아무튼 /dev를 비교해보니 아래와 같이 추가가 되었다.

 CAMEL PC-10  더불정보기술 X-LUK DBC-UP
/dev
crw-rw----+ 1 root audio    14,  20 2009-12-06 19:22 audio1
crw-rw----+ 1 root audio    14,  19 2009-12-06 19:22 dsp1
crw-rw----+ 1 root audio    14,  16 2009-12-06 19:22 mixer1
drwxr-xr-x  4 root root          80 2009-12-06 19:22 v4l
crw-rw----+ 1 root video    81,   0 2009-12-06 19:22 video0

~$ tree /dev/v4l
/dev/v4l
|-- by-id
|   `-- usb-ARKMICRO_USB2.0_PC_CAMERA-video-index0 -> ../../video0
`-- by-path
    `-- pci-0000:00:10.4-usb-0:3:1.0-video-index0 -> ../../video0
/dev



drwxr-xr-x  4 root root          80 2009-12-06 19:30 v4l
crw-rw----+ 1 root video    81,   0 2009-12-06 19:30 video0

$ tree /dev/v4l
/dev/v4l
|-- by-id
|   `-- usb-Vimicro_Corp._PC_Camera-video-index0 -> ../../video0
`-- by-path
    `-- pci-0000:00:10.1-usb-0:1:1.0-video-index0 -> ../../video0

아무튼, video0 장치는 둘다 생기고, video4linux 장비로 인식을 한다. (ffmpeg이 왜 안되는겨 ㅠ.ㅠ)


CAMEL PC-10
$ ffmpeg -y -f video4linux -r 30 -s 320x240 -i /dev/video0 http://localhost:8090/feed1.ffm
FFmpeg version SVN-r19352-4:0.5+svn20090706-2ubuntu2, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --extra-version=4:0.5+svn20090706-2ubuntu2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --extra-cflags=-I/build/buildd/ffmpeg-0.5+svn20090706/debian/include --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Oct 13 2009 22:15:16, gcc: 4.4.1
[video4linux @ 0x85222c0]VIDIOCSWIN: Bad address
/dev/video0: I/O error occurred
Usually that means that input file is truncated and/or corrupted.


더불정보기술 X-LUK DBC-UP
$ ffmpeg -y -f video4linux -r 30 -s 320x240 -i /dev/video1 http://localhost:8090/feed1.ffm
FFmpeg version SVN-r19352-4:0.5+svn20090706-2ubuntu2, Copyright (c) 2000-2009 Fabrice Bellard, et al.
  configuration: --extra-version=4:0.5+svn20090706-2ubuntu2 --prefix=/usr --enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --extra-cflags=-I/build/buildd/ffmpeg-0.5+svn20090706/debian/include --enable-shared --disable-static
  libavutil     49.15. 0 / 49.15. 0
  libavcodec    52.20. 0 / 52.20. 0
  libavformat   52.31. 0 / 52.31. 0
  libavdevice   52. 1. 0 / 52. 1. 0
  libavfilter    0. 4. 0 /  0. 4. 0
  libswscale     0. 7. 1 /  0. 7. 1
  libpostproc   51. 2. 0 / 51. 2. 0
  built on Oct 13 2009 22:15:16, gcc: 4.4.1
Input #0, video4linux, from '/dev/video1':
  Duration: N/A, start: 1260102822.110153, bitrate: 27647 kb/s
    Stream #0.0: Video: rawvideo, yuv420p, 320x240, 27647 kb/s, 30 tbr, 1000k tbn, 30 tbc
Output #0, ffm, to 'http://localhost:8090/feed1.ffm':
    Stream #0.0: Video: mpeg1video, yuv420p, 320x240, q=3-31, 512 kb/s, 1000k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop encoding
[mpeg1video @ 0x9940160]rc buffer underflow
VIDIOCMCAPTURE: Invalid argument
frame=    1 fps=  0 q=31.7 Lsize=      12kB time=10000000000.00 bitrate=   0.0kbits/s
video:8kB audio:0kB global headers:0kB muxing overhead 54.352468%



2010.02.18 추가

열화와 같은 성원(?)으로 드라이버 및 프로그램을 올려 놓습니다.
X-LUK DBC-UP 에는 xp용 드라이버와 감시프로그램이
vista 에는 vista용 드라이버가 들어있습니다.


'Linux API > v4l' 카테고리의 다른 글

v4l2 debug  (0) 2022.07.13
v4l2-ctl 밝기 조절  (0) 2022.07.06
v4l2 timestamp  (0) 2017.04.19
uv4l  (0) 2015.09.13
Posted by 구차니
Linux API/network2009. 11. 30. 17:35
ioctl은

#include <sys/ioctl.h>
int ioctl(int d, int request, ...);

이런 모양인데, int d는 descriptor로 socket을 통해 받아와야 한다.
그리고 request는 /usr/include/bits/ioctls.h 파일에 정의된 내용을 사용하면 된다.


잠시 socket을 소개하자면

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

domain
    Name                Purpose                          Man page
    PF_UNIX, PF_LOCAL   Local communication              unix(7)
    PF_INET             IPv4 Internet protocols          ip(7)
    PF_INET6            IPv6 Internet protocols
    PF_IPX              IPX - Novell protocols
    PF_NETLINK          Kernel user interface device     netlink(7)
    PF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
    PF_AX25             Amateur radio AX.25 protocol
    PF_ATMPVC           Access to raw ATM PVCs
    PF_APPLETALK        Appletalk                        ddp(7)
    PF_PACKET           Low level packet interface       packet(7)

type
   SOCK_STREAM
          Provides sequenced, reliable, two-way, connection-based byte streams.  An  out-of-band  data  transmission
          mechanism may be supported.

   SOCK_DGRAM
          Supports datagrams (connectionless, unreliable messages of a fixed maximum length).

   SOCK_SEQPACKET(is not implemented for AF_INET)
          Provides  a  sequenced,  reliable,  two-way connection-based data transmission path for datagrams of fixed
          maximum length; a consumer is required to read an entire packet with each read system call.

   SOCK_RAW
          Provides raw network protocol access.

   SOCK_RDM
          Provides a reliable datagram layer that does not guarantee ordering.

   SOCK_PACKET
          Obsolete and should not be used in new programs; see packet(7).


protocol
    Normally only a single protocol exists to support a particular socket type within a given protocol family, in which case protocol can be specified as 0.

값들을 필요로 한다.

[링크 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/network_information#s-2.2]

'Linux API > network' 카테고리의 다른 글

hton(), ntoh()  (0) 2011.09.26
netstat 에서 0.0.0.0의 의미  (2) 2009.12.07
termios 구조체를 이용한 자국반향(echo) 제어  (0) 2009.08.27
canonical / non-canonical  (0) 2009.08.27
struct in_addr  (0) 2009.08.18
Posted by 구차니
Linux API/network2009. 8. 27. 14:47
Try It Out − A Password Program with termios

1. Our password program, password.c, begins with the following definitions:
#include <termios.h>
#include <stdio.h>
#define PASSWORD_LEN 8
int main()
{
    struct termios initialrsettings, newrsettings;
    char password[PASSWORD_LEN + 1];

2. Next, add in a line to get the current settings from the standard input and copy them into the termios
structure that we created above.
    tcgetattr(fileno(stdin), &initialrsettings);

3. Make a copy of the original settings to replace them at the end. Turn off the ECHO flag on the
newrsettings and ask the user for their password:
    newrsettings = initialrsettings;
    newrsettings.c_lflag &= ~ECHO;
    printf("Enter password: ");

4. Next, set the terminal attributes to newrsettings and read in the password. Lastly, reset the terminal
attributes to their original setting and print the password to render all the previous effort useless.
    if(tcsetattr(fileno(stdin), TCSAFLUSH, &newrsettings) != 0) {
        fprintf(stderr,"Could not set attributes\n");
    }
    else {
        fgets(password, PASSWORD_LEN, stdin);
        tcsetattr(fileno(stdin), TCSANOW, &initialrsettings);
        fprintf(stdout, "\nYou entered %s\n", password);
    }
    exit(0);
}

[링크 : http://people.freedesktop.org/~nagappan/beginning-linux-programming.pdf]

[링크 : http://ttongfly.net/zbxe/?document_srl=45222]
ttongfly.net 의 내용은 아마도 위의 beginning linux programming의 내용을 번역한 것으로 보인다.

위와 같은 작동은 간단하게 쉘에서
"stty -echo" << echo 끔
"stty echo" << echo 켬
로 가능하다.

하지만, 프로그램에서 쉘 호출 해봤자, 자기 자신에게 적용이 안되므로
termios를 이용해서 직접 제어를 해야 하는데, termios는 말그대로 TERMinal IO Stucture 이다.
소스에서 include 할녀석은 <termios.h> 이고 이녀석은 <bits/termios.h> 을 물어온다.

$ cat /usr/include/bits/termios.h
...
struct termios
  {
    tcflag_t c_iflag;           /* input mode flags */
    tcflag_t c_oflag;           /* output mode flags */
    tcflag_t c_cflag;           /* control mode flags */
    tcflag_t c_lflag;           /* local mode flags */
    cc_t c_line;                        /* line discipline */
    cc_t c_cc[NCCS];            /* control characters */
    speed_t c_ispeed;           /* input speed */
    speed_t c_ospeed;           /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
  };
...
/* c_lflag bits */
#define ISIG    0000001
#define ICANON  0000002
#if defined __USE_MISC || defined __USE_XOPEN
    # define XCASE  0000004
#endif
#define ECHO    0000010
#define ECHOE   0000020
#define ECHOK   0000040
#define ECHONL  0000100
#define NOFLSH  0000200
#define TOSTOP  0000400
#ifdef __USE_MISC
    # define ECHOCTL 0001000
    # define ECHOPRT 0002000
    # define ECHOKE  0004000
    # define FLUSHO  0010000
    # define PENDIN  0040000
#endif
#define IEXTEN  0100000

'Linux API > network' 카테고리의 다른 글

netstat 에서 0.0.0.0의 의미  (2) 2009.12.07
ioctl을 이용한 정보수집  (0) 2009.11.30
canonical / non-canonical  (0) 2009.08.27
struct in_addr  (0) 2009.08.18
ifup/ifdown  (0) 2009.08.18
Posted by 구차니
Linux API/network2009. 8. 27. 14:24
리눅스 터미널 프로그래밍에서
캐노니컬 모드(canonical)는 한줄 단위로 받아들이고
넌 캐노니컬 모드(non-canonical)는 문자 단위로 받아들인다.

[링크 : http://ttongfly.net/zbxe/?document_srl=45222]
Posted by 구차니
Linux API/network2009. 8. 18. 14:51
vi /usr/include/linux/in.h

53 /* Internet address. */
54 struct in_addr {
55         __u32   s_addr;
56 };

char *inet_ntoa(struct in_addr in);

에서 사용하는 구조체이다.
단일 변수 하나의 구조체인데..
굳이 구조체로 만든 이유는.. IPv6 등을 위한걸려나..



사족 : 귀찮으면 int형으로 그냥 쓰면된다. 그런데.. 이 내용 저번에 적었던거 같은데... 기억이 안나네 -ㅁ-?
Posted by 구차니