'udp'에 해당되는 글 1건

  1. 2006.07.18 TCP/IP 추가 and UDP /IP

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같은 함수를 입출력을 해도 된다고 하네요..
prev 1 next