Accept 에러
리눅스에서 잘 돌던 소스가 AIX에 넘어와서 이렇게 에러를 떨어뜨리네요
소켓은 block이구요 계속적으로 아래 로그처럼 1초에 한번씩 발생합니다.
어제 [UnKnown]
[12:48:36] Accept IP[0.0.0.0] nClientHandle[-1] errno[0] LINE[951]
[12:48:37] Accept IP[0.0.0.0] nClientHandle[-1] errno[0] LINE[951]
오늘 첫번째 [EWOULDBLOCK]
[12:18:36] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:37] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:38] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:39] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:40] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:41] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
[12:18:42] Accept IP[0.0.0.0] nClientHandle[-1] errno[35] LINE[951]
오늘 두번째 [EINTR]
[14:29:22] Accept IP[0.0.0.0] nClientHandle[-1] EINTR LINE[979]
[14:29:23] Accept IP[0.0.0.0] nClientHandle[-1] EINTR LINE[979]
[14:29:24] Accept IP[0.0.0.0] nClientHandle[-1] EINTR LINE[979]
[14:29:25] Accept IP[0.0.0.0] nClientHandle[-1] EINTR LINE[979]
[14:29:26] Accept IP[0.0.0.0] nClientHandle[-1] EINTR LINE[979]
위의 증상처럼 시간대별로 틀리고 분명히 아무 옵션이 없이 아래와 같이 생성했으니 block소켓 아닌가요?
클라이언트가 준비가 안되어 있고 혼자 도는데 계속적으로 accept에러가 위와 같이 떨어지네요
g_ServerHandle = socket(PF_INET, SOCK_STREAM, 0);
setsockopt(g_ServerHandle, SOL_SOCKET, SO_REUSEADDR, (char *) &bf, (int) sizeof(bf));
memset(&g_stServerAddr, 0, sizeof(struct sockaddr));
g_stServerAddr.sin_family = AF_INET;
g_stServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);
g_stServerAddr.sin_port=htons(SERVER_PORT);
g_stServerAddr.sin_len=sizeof(g_stServerAddr);
아래는 accept 소스입니다.
stClientAddr.sin_len = SIZE_SOCKADDR;
nClientHandle = (int)accept(g_ServerHandle, (struct sockaddr *)&stClientAddr, &addr_len);
부탁드립니다.
EWOULDBLOCK 으로 찾아보니...
//
Linux 는 Little-endian 과 Big-endian 모두 있고.
AIX 는 Big-endian 인것이 좀 다르네요.
OS가 아니라. 하드웨어(CPU Processor) 기준으로 생각됩니다.
[ Byte Order ] Big-Endian vs Little-Endian
http://sadiles.blog.me/10075781095
http://ascarion.tistory.com/41
//
제가 경험한 바로는...
- 잘되는 책예제를 따라하는것이 좋습니다.
- 함수의 인자값과 리턴값을 책이나 문서를 보며. 확인해야 합니다.
- 이와 비슷한 오류를 찾아봐야 합니다.
- 랜 카드. 케이블선. 백신. 포트. 방화벽. OS 옵션. IP상태. 64비트. IPv6. 버전. \r\n 언어 로케일 문자셋...등등
- OS 마다. 정의된 값이 다를 수 도 있으니. 확인이 필요합니다.
- OS에서 지정된 소켓의 갯수 처리량
- 소켓 버퍼크기에 따른. 메모리의 할당과 해지시 느려지는 문제
- CPU 처리 속도 (점유율 100%)
//
Big-endian vs Little-endian
http://yjseo.tistory.com/128
Little-endian operating systems:
Linux on x86, x86-64, MIPSEL, Alpha, Itanium, S+core, MN103, CRIS, Blackfin, MicroblazeEL, ARM, M32REL, TILE, SH, XtensaEL and UniCore32
Mac OS X on x86, x86-64
OpenVMS on VAX, Alpha and Itanium
Solaris on x86, x86-64, PowerPC
Tru64 UNIX on Alpha
Windows on x86, x86-64, Alpha, PowerPC, MIPS and Itanium
Big-endian operating systems:
AIX on POWER
AmigaOS on PowerPC and 680x0
HP-UX on Itanium and PA-RISC
Linux on MIPS, SPARC, PA-RISC, POWER, PowerPC, 680x0, ESA/390, z/Architecture, H8, FR-V, AVR32, Microblaze, ARMEB, M32R, SHEB and Xtensa.
Mac OS on PowerPC and 680x0
Mac OS X on PowerPC
MVS and DOS/VSE on ESA/390, and z/VSE and z/OS on z/Architecture
Solaris on SPARC
Big endian, little endian 프로그래밍
http://blog.naver.com/syongbum/140007379838
Little Endian과 Big Endian
http://egloos.zum.com/recipes/v/4993723
Endianness (Little Endian)
http://en.wikipedia.org/wiki/Endianness
2.1 Bi-endian hardware 빅 인디안은 하드웨어! ㅡ_ㅡ;; 라고 하네요.
//
setsockopt() REUSE 잘 안되던거 같습니다. ㅡ_ㅡ;;
memset() 메모리셋을 해서. 잘안되던 경우가 있었는데. 다른 이유에서 일지 모릅니다.
그냥. non-block socket 으로 만들고. 종료하는 방법이 가장 빨랐습니다.
//
구글에서 찾아보니. 여러가지 내용이 있네요.
https://www.google.co.kr/search?q=EWOULDBLOCK&rlz=1C1VFKB_enKR634KR637&oq=EWOULDBLOCK&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
//
AIX 로 찾아보니. IBM 이메일 문의가 있네요.
http://www-03.ibm.com/systems/kr/power/software/aix/
//
EINTR
https://www.google.co.kr/search?q=EINTR&rlz=1C1VFKB_enKR634KR637&oq=EINTR&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
Unix connect() and interrupted system calls
http://www.madore.org/~david/computers/connect-intr.html
socket 중 함수 만난 EINTR 처리
http://www.programkr.com/blog/MEzN1ADMwYTw.html
[Q/A] socket, read, EINTR
http://rootfriend.tistory.com/168
//
Accept IP[0.0.0.0]
https://www.google.co.kr/search?q=Accept+IP%5B0.0.0.0%5D&rlz=1C1VFKB_enKR634KR637&oq=Accept+IP%5B0.0.0.0%5D&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
What is the difference between 0.0.0.0, 127.0.0.1 and localhost?
http://stackoverflow.com/questions/20778771/what-is-the-difference-between-0-0-0-0-127-0-0-1-and-localhost
if I put accept all 0.0.0.0/0 means this server is totally open for any ip?
http://serverfault.com/questions/246097/if-i-put-accept-all-0-0-0-0-0-means-this-server-is-totally-open-for-any-ip
//
socket error 35
https://www.google.co.kr/search?q=Accept+IP%5B0.0.0.0%5D&rlz=1C1VFKB_enKR634KR637&oq=Accept+IP%5B0.0.0.0%5D&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8#newwindow=1&q=socket+error+35
Errno 35 (EAGAIN) returned on recv call
http://stackoverflow.com/questions/14595269/errno-35-eagain-returned-on-recv-call
//
C Socket errno Codes
http://www.workers.com.br/manuais/53/html/tcp53/mu/mu-7.htm
Secure Programming for Linux and Unix HOWTO
https://wiki.kldp.org/HOWTO/html/Secure-Programs-HOWTO/
BeeJ's Guide to Network Programming
https://wiki.kldp.org/wiki.php/BeeJNetworkProgramming
C 소켓 프로그래밍 FAQ
https://wiki.kldp.org/wiki.php/CSocketFAQ
socket() 함수가 일정 시간이 지나면 fd를 못 가져 옵니다 ;
https://kldp.org/node/77180
//
SOCKADDR_IN 구조체
https://msdn.microsoft.com/ko-kr/library/zx63b042.aspx
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
7.5. Essential Socket Functions
https://www.freebsd.org/doc/en/books/developers-handbook/sockets-essential-functions.html
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
//
.s_addr=htonl
https://www.google.co.kr/search?q=.s_addr%3Dhtonl&rlz=1C1VFKB_enKR634KR637&oq=.s_addr%3Dhtonl&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
//
.sin_port=htons
https://www.google.co.kr/search?q=.sin_port%3Dhtons&rlz=1C1VFKB_enKR634KR637&oq=.sin_port%3Dhtons&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
//
.sin_len=
https://www.google.co.kr/search?q=.sin_len%3D&rlz=1C1VFKB_enKR634KR637&oq=.sin_len%3D&aqs=chrome..69i57&sourceid=chrome&es_sm=93&ie=UTF-8
//
EWOULDBLOCK/EAGAIN
http://sthyun.tistory.com/entry/EWOULDBLOCKEAGAIN
ewouldblock (eagain) 에러 발생 원인이 뭘까요
https://kldp.org/node/74526
select(), recv() and EWOULDBLOCK on non-blocking sockets
http://stackoverflow.com/questions/911565/select-recv-and-ewouldblock-on-non-blocking-sockets
EWOULDBLOCK Error in socket programming
http://stackoverflow.com/questions/11927848/ewouldblock-error-in-socket-programming
(펌) 네트워크 함수의 Blocking/Non Blocking I/O 동작
http://resetme.tistory.com/58
Re: Why still checking for EWOULDBLOCK after select() on non-blocking sockets?
https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014479532
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답글 정말 감사합니다. 다시한번 세세하게 살펴보고
답글 정말 감사합니다.
다시한번 세세하게 살펴보고 결과를 올리겠습니다.
감사합니다.
- EWOULDBLOCK은 외부연결이 들어오지 않은
- EWOULDBLOCK은 외부연결이 들어오지 않은 nonblocking socket에서 accept시 발생
- EINTR은 시그널이 들어와서 시스템콜 탈출 일어날때의 에러코드.
저게 복잡한 프로그램의 일부라면 다른 스레드 같은데서 메모리 잘못 접근했거나 자기자신에게 시그널 보낸다거나 등등을 점검해보셔야 할거 같습니다. 저부분만 따로 떼서 테스트용 송수신 프로그램 만들어서 확인해보시고 예상한 대로 돌아간다면 다른 부분들을 모두 점검하셔야 할거 같네요.
그리고 aix 머신들은 cpu가 모두 ibm power 계열입니다. 전부다 big endian입니다.
Written By the Black Knight of Destruction
답글 정말 감사합니다. 제가 궁금한것은 위 소스에서
답글 정말 감사합니다.
제가 궁금한것은 위 소스에서 선언한건 bloking socket이 확실하죠?
왜 nonblocking socket 에러가 발생되는지? 모르겠네요ㅠㅠ
혹 사용하는 port가 방화벽이나 이런데서 막혀 있으면 이런 에러가 발생하는지 궁금도 하고요 ㅠㅠ
암튼 답변 진짜 감사합니다.
댓글 달기