'Programming'에 해당되는 글 58건

  1. 2006.07.18 Glade! 리눅스 GUI 프로그래밍 툴
  2. 2006.07.18 TCP/IP 추가 and UDP /IP
  3. 2006.07.06 열혈강의 TCP/Ip Socket Programming --Part 1 1

Glade! 리눅스 GUI 프로그래밍 툴

제 리눅스 책뒤에 Gtk+가 설명이 있길래..

(읽기만 했지 머가 먼지 아직도 모름........)

쭉보고 있다가... M$ Windows 의 VB처럼..  윈도우 화면(비베식으로 폼) 을 마우스 클릭/드래그

해서 컨트롤을 올리듯이.. 하는게 리눅스에는 없을까... (이 뻔한걸 일일이 코딩하긴 그렇고..)

하고서 구글링 and MSN을 이용해서 알아본 결과 Glade라는 툴을 알게 되었죠..

사실.. 처음 무지 당황했습니다.. 속성 설정하는 부분도 있고 화려할거 같았지만..

달랑 메뉴 5개 툴바 5개의 썰렁한 화면.........;;; 그리고 팔렛트...

처음엔 정말.. 새파일 열기 해도.. 아무것도 안뜨는겁니다 폼같은거라도 떠야 뭘 잡아 끌든 말든 할텐데..

팔렛트에서 겨우 윈도우라는 것을 누르니깐 폼이 뜨더라는(새파일 하면 바로 나올줄 알았는데 아니더군요)

일단 윈도우(폼)를 하나 만들고 팔렛트(VB식으로 컨트롤모음)에 요소들을 클릭해서 비베처럼 끌었습니다..

그런데.. 이번엔 비베처럼 아예 끌리지도 않는겁니다.. 아 이것땜에 몇일동안 처박아 두었는데...

오늘에서야 알았는데.."고정된 위치"라는 컨트롤을 사용하니깐 비베처럼 컨트롤을 끌수가 있겠더군요..!

또 하나 문제점이 발생했습니다.. 속성 설정하는게 또 뭔지 몰라서.. 메뉴 뒤저보니깐 속성창이라는게

하나 있네요.. 그걸 뛰우고 컨트롤? 클릭 하니깐 속성이 쫙 보이는... 흠.

그래서 시험삼아서 방금 이녀석으로 Hello World~  예제를 작성해 보았습니다

하하.. 버튼도 하나 만들어서 클릭 하면 윈도(폼) 이 자동으로 꺼지게~ 말이죠..

버튼 클릭해서 꺼지게 할려면 Gtk 시그널,핸들 을 알아야 하더군요...

전 몰라서 그냥 보이는데로 이리리 찍었습니다만..

시그널은 그 객체가 어떻게 반응을 받는가? 핸들은 무었을(시그널에 받은것에) 실행시킬까? 이런거 같네요

앞에서도 말했지만.. 정말 모릅니다.. 대충 찍었을뿐 ..

객체:button1 에 대해서 속성의 시그널 탭에--> signal:click handle:gtk_main_quit

(아 글구 꼭 저장을 해야 하더군요 .........)

이렇게 만들어 놓으면 button1을 클릭하면 프로그램이 종료 되더군요  아신기...하다~

이부분은 뭔가 비베와 비슷한부분? 인거 같네요..흠..(설마 이것도 객체지향인가 아 몰겟네.;;)

아 그리고 파일을 제공해서 빌드하면 자동으로 컴파일 할수 있는 상태로 만들어 주는 좋은 기능도 있네요.

autogen.sh 라는 스크립트를 이용하면 되네요.. 그리고 make... src디렉토리에 들어가면

제가 만든 프로그램이 나오네요 흐흐 실행해 볼가나..


저런 허접한 플그램 하나가 나옵니다.. 종료 버튼을 누르면 프로그램 종료~

(소켓해야하는데.. 왜 내가 이걸 하고 있을까;;;;;;;;;)

'Programming > GTK+' 카테고리의 다른 글

vte를 이용한 간단한 터미널  (2) 2007.01.14
libglade 컴파일법  (1) 2006.12.14
TODAY.... 삽질 DAY  (6) 2006.08.09
(초보) gtk 작성팁  (10) 2006.08.04
GTK_TEXT 에러..해결책  (4) 2006.07.30

TCP/IP 추가 and UDP /IP

Iterative 서버의 구현

while(1)
{
   client_fd=accept(&ser_sock,(struct sockaddr *)&client_addr,&client_addr_size);
         //에러 처리는 알아서 하자 귀차너//
   write(client_fd,SendMessage,sizeof(SendMessage)):
   close(client_fd);
} //아라.. 다시 보니깐 read 안썻네..

내 개인적인 생각이지만 다른거라면 while을 돌려서 쉬지 않게 메세지를 받게 하는 기능 정도만
추가된거 같다

음 근데 왜 accept함수를 while 문 안에 넣느냐 하면.. 아니 설명할 필요도 없나..
뭐 한번더 기억을 상기시켜 보자면은.. accept함수가 메세지를 입력 받는 함수이다(뭐라하는건지 쿨럭;)
라서 이다 ,;;

그림으로(?) 그려(?) 보았다 ....

socket() -> bind() ->listen() -> accept() -> file in/out -> close(client) ->close(server) ->END
                                                             |__________________________|
                                                                             while(1)

(책에서는 서버를 닫아주지 않았다... 끝날때 알아서 종료 되니깐 귀찮아서 안한거 같다....)

다른게 있다면 저~기 While 문을 썻다는거 뿐!


Plus! Packet

서버랑 클라이언트랑 메세지를 전달할때(아래서 부턴 패킷으로 부름) 크기가 정해져서 수신/전송이
되는게 아니다(라고 한다)
그래서 클라이언트일경우 쓴만큼 읽어 들여야 한다..

뭐어 대충 구조는 다음과 같다

1.write call해서 일단 쓴다..write함수의 리턴값을 저장하고서(이값이 read시 Max값이 되겠죠?)
wr=write(~);

2.반복문을 돌린다(while이든 for이든.. ) ex>for(i=0~

3. 반복문 안에 read함수를 넣고 리턴값을 받는다(이 리턴값은 read한 크기입니다) 에러처리를 하고 싶으면 한다 ex> rd=read(~);

4.i값이랑 read함수에서 받은 리턴값이랑 합산애서 i에 대입 ...i+=rd

5 증가값은 적지마시고 최대 Max값이 i 값보다 작을때까지 반복

이거 했갈릴테니깐 코드로 작성하믄

wr=write(sockfd,buf,strlen(buf)):

for(i=0;i<wr;)
{
   rd=read(sockid,&buf[i],wr-i);//에러 작성문은 알아서 만듭시당..
   i+=rd;
}
-------------------아놔... 제가 만들어 놓고서 뭐라고 적어논건지 모르겠어요----------------------

UDP? User Datagram Protocol 이랍니다.

데이터의 경계가 있기때문에(빼먹었는데 TCP에는 없습니다)클라이언트에서 질의를 3번하면
서버에서 응답을 3번해야한다는겁니다(그런거 같았;;)

그리고 TCP와는 달리 2개가 서로 연결되어서 통신하는게 아니기 때문에.. 간단하고 속도가 빠릅니다.

다음은 UDP 프로그램의 기본적 구조

server:구조체선언->구조체의 값 집어넣기->bind->입/출력.반복->소켓 닫음
(listen,accept함수가 없습니다)

client:구조체 선언->구조체에 값 집어넣기->파일 입출력(반복)->소켓 닫기
(connect 함수를 안써도 됩니다(때에 따라서))

동영상 스트리밍 서비스 같은데 많이 사용한다고 하더군요..빠른속도로 보내야 하니까요.. 대신 데이터

손실를이 높으니까 파일전송같은덴 알맞지가 않겠네요

뭐 암튼 TCP와는 다르게 파이프처럼 서로 연결된게 아니고 보내고 끝이라는 겁니다.

그렇기 때문에 보내고 받는함수를 read,write하지 말고 특수한 함수를 사용해야 한다네요

int sendto
(int sock,const void *meg,int len,unsigned flags,const struct sockaddr * addr,int addrlen);
sock:socket함수의 리턴값
meg:전송할 데이터를 저장하는 버퍼를 가르키는 포인터(이 포인터가 가르키는 곳으로 부터 데이터전송시작)
len,meg의 포인터가 가진 기점으로부터 몇바이트를 보낼것인가?(sizeof~)
flags:옵션,일반적으로 0을 넣어줌 자세한건 man페이지 참조
addr:앞에서 절라 써먹던 그 구조체
addrlen:앞에서 절라 써먹던 그 구조체의 크기

int recvform(int sock,int *buf,int len,unsigned flags,struct sockaddr * addr,int *addrlen);
sock:이건 정말 말하기 지겹다
buf:받은 데이터를 저장할곳을 가르키는 포인터
len:수신할수 있는 최대 바이트 어지간하면 buf값을 넘지 않도록 주의 한다
flags:전과 상등
addr:주소 정보 구조체 변수의 포인터를 인자로 넘김,다 완료되면 데이터를 전송한 호스트의 정보가 이
구조체에 저장되게 된다
addrlen:addr포인터의 크기를 가진 변수의 주소를 넘긴다

포트정보는 sendto 쓸때 같이 보내진다고 합니다

Plus! Connect 함수 사용
이 함수를 사용하면 일단 커널과 소켓간에 연결을 유지하면서 통신할수 있습니다.
(걍 TCP/IP 쓸때처럼 Connect함수를 while돌리기 전에 써주면 끝입니다)
그래서 속도향상을 꽤할수 있고.. 미리 정보를 전달해 주기때문에.. sendto,recvform 함수를 쓰지
않고서 read,write같은 함수를 입출력을 해도 된다고 하네요..

열혈강의 TCP/Ip Socket Programming --Part 1

간단하게 정의
(클라이언트, 서버는 네트워크에 연결되어 있다고 가정)

클라이언트:정보를 보내는 프로그램(요청)
서버:정보를 받는 프로그램(수락)
*서버와 클라이언트는 소켓으로 연결을 한다

서버 프로그래밍의 예시

--전화                                               소켓                                           관련 함수
전화 사기                                    소켓 생성하기                                      (socket 함수)
전화 번호 얻기                            아이피 주소 얻어오기                                  (bind 함수)
전화 케이블에 연결하기                    신호 요청 대기                                      (listen 함수)     
전화 걸기                                       연결수락                                           (accept 함수)        

클라이언트 프로그래밍의 예시

--전화                                               소켓                                           관련 함수
전화 사기                                    소켓 생성하기                                     (socket 함수)
연결 요청                                    소켓 연결하기                                      (connect함수)
         
TCP  트랜스미션 컨트롤 프로토콜 :말그대로 "제어"한다 IP라는거 자체가 데이터를 전달하는게 정확성이
없다 쉽게 말해서 보내주긴 보내주는데 제 주소에 보내지던 말던은 상관을 안한다는 얘기..
그리하여 그런 상황을 미연에 방지하기 위해서 데이터를 송/수신 할때마다 제대로 도착했는지를 확인하는
프로토콜 이라고 말하면 대충 되려나...

UDP 유저데이터그램 프로토콜: 이녀석은 확인 같은거 안하고 걍 보내고 끝. 그래서 속도가 빠르다고 한다나

포트:각각의 프로세스가 이 포트와 연결되 있고(물론 네트워크와 관련된 프로세스들)여기서 각 네트워크
에서 오는 메세지를 받는곳(또는 보내던가).. 뭐 비교하자면

라우터:각각의 호스트(or 라우터)
들을 연결 한다  네트워크 A에서 네트워크 B로 데이터가 이동할려면 반드시  각
네트워크를 관리하는 라우터 끼리 연결이 되어야 한다
HostA->RouterA->RouterD->RouterE->RouterF....->RouterB->HostB
------------------------                                                                   ------------------------
Network A                                                                                    NetworkB


#include<sys/types.h>
#include<sys/socket.h>

sockfd=int socket(int domain,int type,int protocol);
int bind(int sockfd,struct sockaddr *myaddr,int addrlen);
int listen(int sockfd,int backlog);
sockfd2=int accept(int sockfd,struct sockaddr *addr,int *addrlen);
int connect(int sockfg,struct sockaddr *serv_addr,int addrlen);

//구조체 설명은 나중에 한다나 뭐라나..

다음 1-3 파트는 생략. 파일 입출력이므로 ,,,PASS
파트 1은 별루 한것도 없이 그냥 끝~~~~

--------추가 _t 자료형(size_t,time_t,key_t등)-----------
에 대해서는 컴퓨터 비트가 바뀌면서 저장크기(ex int.. 16bit==2 32bit==4)
의차이가 나게 되므로 이런 경우를 줄이기 없애기 위해서 해더파일에서 정의 해 놓은 모양임

'Programming > Networking' 카테고리의 다른 글

gethostbyname 의 세그멘테이션 오류  (2) 2008.02.28
소켓shutdown..DomainName<->IP  (0) 2006.07.18
TCP/IP 추가 and UDP /IP  (0) 2006.07.18
소켓 프로그래밍 part 2~4 TCP/IP  (4) 2006.07.15
prev 1 ··· 9 10 11 12 next