Windows Overlapped Read할때 Timeout구현 문제...

jic5760의 이미지

안녕하세요.
ReadFile을 Timeout을 지원하도록 소스를 짜고 있는데 한가지 문제점이 발생합니다.

CancelIoEx부분은
https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363789(v=vs.85).aspx
이걸 참고했습니다.

아래처럼 소스를 짰는데 랜덤하게 데이터를 읽어오지 못하는 (버려져버리는)문제가 발생합니다.
어떻게 고쳐야 할지 모르겠네요...ㅠㅠ
ReadFile을 기다리지 않는다고 왜 데이터까지 버려지는지...

int readStdout(char *pbuffer, int bufsize, DWORD *pdwReadLen, DWORD dwTimeout)
{
	const DWORD PollInterval = 100;
 
	int retval = 0;
 
	DWORD dwWaitRst;
	BOOL bRst;
	DWORD dwErr;
 
	BOOL bIoComplete = FALSE;
	DWORD waitTimer;
 
	OVERLAPPED ov = {0};
 
	ov.hEvent = m_hStdoutRdEvent;
 
	bRst = ReadFile(m_hStdoutRd, pbuffer, bufsize, pdwReadLen, &ov);
	if(!bRst)
	{
		do {
			dwErr = GetLastError();
			if(dwErr != ERROR_IO_PENDING)
			{
				retval = -((int)dwErr);
				break;
			}
			dwWaitRst = WaitForSingleObject(m_hStdoutRdEvent, dwTimeout);
			if(dwWaitRst == WAIT_OBJECT_0)
			{
				bRst = GetOverlappedResult(m_hStdoutRdEvent, &m_comm_StdoutOverlapped, pdwReadLen, FALSE);
				if(bRst)
				{
					retval = 1;
				}else{
					dwErr = GetLastError();
					retval = -((int)dwErr);
				}
			}else if(dwWaitRst == WAIT_TIMEOUT)
			{
				retval = 0;
			}else{
				dwErr = GetLastError();
				retval = -((int)dwErr);
			}
		}while(0);
	}else{
		retval = 1;
	}
 
	return retval;
}
jic5760의 이미지

글을 작성하고 소스를 좀 수정했는데 위와 같이 하니 되는거 같네요~ 혹시 소스에 문제가 있다면 알려주세요~

sj.oh의 이미지

저도 랜덤하게 readfile에서 잘려서 나옵니다..
도와주십시오..

shint의 이미지


- 잘된 예제를 참고해보세요.
- 해당 함수에 인자값. 리턴값. 오류값을 확인해보세요.
- 오류가 발생한 코드를 모두 지우고. 잘 되는것만 확인 해보세요.

ReadFile
https://www.joinc.co.kr/w/man/4200/ReadFile

ReadFile function
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfile

GetOverlappedResult
https://www.codeproject.com/search.aspx?q=GetOverlappedResult&x=13&y=8&sbo=kw

GetOverlappedResult function
https://docs.microsoft.com/en-us/windows/desktop/api/ioapiset/nf-ioapiset-getoverlappedresult

Testing for the End of a File
https://docs.microsoft.com/ko-kr/windows/desktop/FileIO/testing-for-the-end-of-a-file

시리얼 통신_OVERLAPPED 구조체를 이용해 비동기 쓰기를 해보자
http://goodjian.tistory.com/entry/시리얼-통신OVERLAPPED-구조체를-이용해-비동기-쓰기를-해보자

비동기 I/O 와 APC
http://dakuo.tistory.com/108

Windows IOCP vs Linux EPOLL Performance Comparison
https://www.slideshare.net/sm9kr/iocp-vs-epoll-perfor?next_slideshow=1

IOCP 서버 코어 및 채팅서버 실무 고급 자료
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=278&MAEULNO=20&no=32322&page=2

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.