'---->OLD<-- 과거는/프로그래밍'에 해당되는 글 2건

  1. 2009/05/26 [펌]recvfrom() with time-out checking (2)
  2. 2009/05/19 extern “C”

참조 : http://blog.phamansinh.com/2008/08/10/recvfrom-with-time-out-checking/

우리가 일반적으로 사용하는 Network 프로토콜중 UDP로 부터 데이터를 받는 함수가 recvfrom()이다.  이함수는 네트워크로 부터 메시지가 들어올때까지 대기한다. – 메시지가 안들어오면?.. 들어올때 까지 대기한다.  끝까지… 사용자가 종료하기 전에는 쭈욱 기다리는 것이다.

해결 1. select()

recvfrom 이 호출되면 무엇인가 받을 때 까지 대기한다고 했다. 그럼 해결방법은 무엇인가 들어올때 recvfrom을 호출해 주면 된다.  그와 같은 일을 해주는 것이  select 함수이다. timeout 이란 것이 있어서 기다리는 시간을 설정할수 있다. timeout  만큼 기다려서 들어오지 않으면 도착하지 않은것으로 판별하면 된다. 그전에 데이터가 도착한다면 특정함수를 호출해주면 된다. 우리는 데이터를 가져오기 위한  recvfrom를 호출하는 것이다. 

image

manpage의 내용을 좀더 적어 보면?
- select 는 상태가 변경되는 파일 기술자들의 숫자를 기다린다.

참조 페이지에 있는 예제 소스를 가져와 보겠다.  (외국 블로그라 영어로, 코드가 원래 영어지만)

int recvfromTimeOut(SOCKET socket, long sec, long usec)
{
	// Setup timeval variable
	timeval timeout;
	timeout.tv_sec = sec;
	timeout.tv_usec = usec;
	// Setup fd_set structure
	fd_set fds;
	FD_ZERO(&fds);
	FD_SET(socket, &fds);
	// Return value:
	// -1: error occured
	// 0: timed out
	// >0: data ready to be read
	return select(0, &fds, 0, 0, &timeout);
}

 

res = recvfromTimeOut(s, 10, 0);
switch (res)
{
case 0:
	// Timed out, do whatever you want to handle this situation
	break;
case -1:
	// Error occured, maybe we should display an error message?
	break;
default:
	// Ok the data is ready, call recvfrom() to get it then
	recvfrom(s, buf, 1024, 0, (sockaddr *)&addr, &fromLen);
}

나는 recvfromTimeOut 안에서 recv 까지 사용할 생각을 했다. 그런데 ? 그럼 return에 대한 문제가 발생할듯하다. recvfrom의 원래 return 값과, timeOut에 의한 return값이 중복이 될듯하다.

 

해결 2. non-blocking  I/O

간다한 해결법으로 recvfrom을 안기다리도록 만들면 되는것 아닌가?

blocking I/O 방식이기 때문에 recvfrom은 무한정 대기하는 것이다. 그럼 non-blocking I/O 방식으로 recvfrom를 만드는 것이다. 소켓의 설정(?)에 그와 같은것이 들어 있다.

// Set our socket to non-blocking mode using ioctlsocket() function
u_long iMode = 1;
if (ioctlsocket(s, FIONBIO, &iMode))
{
	cout<<"ioctlsoket failed"<<endl;
	return 1;
}
image

위와 같이 설정을 하게 되면 recvfrom은 무조건 return 하게 된다.

endTime = clock() + 5000;
while (recvfrom(s, buf, 1024, 0, (sockaddr *)&addr, &fromLen) == -1 && clock() < endTime)
{
}

위와 같은 코드로 변경하여 recvfrom 이 –1을 리턴하고 endTime이 안되었으면 계속 반복하는것이다.

이것은 무한 루프처럼 계속 반복된다는 단점이 있다.

그래서 1번 방법을 더 추천한다.

 

참조 블로그에 있는 내용을 그대로 가져왔다

한글로 그리고 내가 적고 싶은 방법으로 바꾸었지만 원본에 추가된 내용이 별로 없는듯 하다.

Tistory 태그: ,,,

'---->OLD<-- 과거는 > 프로그래밍' 카테고리의 다른 글

[펌]recvfrom() with time-out checking  (2) 2009/05/26
extern “C”  (0) 2009/05/19
Posted by 인고의생애

 

http://wiki.kldp.org/wiki.php/DocbookSgml/C++-dlopen#MANGLING

http://yesarang.tistory.com/69

http://pinge.egloos.com/4267350

 

구글에서 검색해서 나온 글들이다.

내가 볼 때 이해하기 좋고 내용이 있는 글에 대한 링크? 이다.

 

Name Mangling 이란것도 알았고 두번째 링크는연구실에서 계속 시도하여 해결했던 것을

논리적으로 정리해 놓은 글이라 좋은 느낌이다. ㅋ

연구실에서는 이런 내용에 대해서 모르고 정말 오랜 기간 이것 저것 해보며 결과적으로는 위에 글과 유사하게 (동일하다고 말해야할지 모르겠다.) 만들어 놓았다. 그리고 현재 잘 동작하고 있다.

멤버함수를 THREAD로 구동시키는 것이다.

 

extern "C"
C++에서 C로 컴파일 하는 부분에 대한 정의 – 일부만 옳바른 정보

링크의 글들을 읽다가 보면 extern "C" 라는 것은 함수명에 대한 Name Mangling를 하지 않도록 하는 것이라는 것을 알수 있다. 따라서 C언어로 작성한 코드에서 C++에서 만들어지고 컴파일 된 함수를 호출할 수 있다.

또한 재미난 것은 위 링크에 있는 글을 보고 인용한 것이지만 조금더 뒤에 개발된 C++가 C를 위해서 너 이렇게 나를 호출해라~ 라며 알려주는 역할을 하는 것이다. C는 아무것도 모르고 자기 것인양 사용하면 된다. C++가 C언에 맞추어 주는 것이다. C++는 C에 있는 것을 그냥 사용하면 된다. 그러나 C++에서 만들어지고 정의된 것은 C에서 사용하는데 있어서 주의가 빌요 하다. .. 반대로 만드는 사람이 많은 부분을 신경 써야한다.

Name mangling은 컴파일러에 규칙이 나오지 않는다. 규칙이 나오지 않는다는 것은 각 컴파일러 벤더가 자기 마음대로 할수 있다는 것을 의미한다. Gnu의 경우 2.X 의 컴파일러와 3.X의 Name mangling이 다르다고 한다. 그럼 컴파일러의 버전이 다르게 만들어진 라이브러리 등은 서로간에 호환이 되지 않는 다는 것이다. 따라서 개발자는 조금더 주의를 하여야 한다.

 

위에 링크.. 조금 시간적 여유를 가지고 읽어 주면 많은 도움이 될 것이라 생각한다.

'---->OLD<-- 과거는 > 프로그래밍' 카테고리의 다른 글

[펌]recvfrom() with time-out checking  (2) 2009/05/26
extern “C”  (0) 2009/05/19
Posted by 인고의생애