2009-10-06 4 views
1

비 블로킹 소켓은 fcntl() 메서드를 호출하고 O_NONBLOCK 플래그를 해당 소켓과 연결하는 소켓입니다. 아무도 정상적인 TCP_IP 소켓을 비 블로킹 소켓으로 변환하는 데 필요한 다른 것을 말해 줄 수 있습니까?비 블로킹 소켓

Windows 서버에서 비 차단 소켓을 잘 작동 시키려면 어떤 문제가 발생할 수 있습니까? 리눅스에 대한

+1

소리가 너무 숙제와 비슷합니다. 두 번째 질문은, 두 가지 다른 종류의 초등 OS 프로그래밍을 필요로하는 실행 가능한 프로젝트를 만들 수 없다는 것입니다. –

+0

실제로는 온라인 환경에서 들어오는 트래픽을 기다리지 않고 사용하기위한 것입니다. –

답변

8

예 초기화는 다음과 같이 보일 수 있습니다 :

int flags; 
s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP) // ret 5 
setsockopt(s, SOL_TCP, TCP_NODELAY, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, [1], 4) 
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, [1], 4) 
flags = fcntl(s,F_GETFL,0); 
assert(flags != -1); 
fcntl(s, F_SETFL, flags | O_NONBLOCK); 
connect(s, {sa_family=AF_INET, sin_port=htons(5001), sin_addr=inet_addr("192.168.0.68")}, 16) 

기본 백서 태양에서 : 창에

sun asych net

당신은 비 차단 네트워킹을 얻을 수 중복 된 IO 소켓을 사용합니다.

리눅스에

Look here and in MSDN how to write code with OVERLAPPED structures

사용의 epoll().

solaris socket().

준비가되지 않았 으면 소켓을 읽거나 쓰는 것에 유의하십시오. (선택 - 출력) EAGAIN 오류가 나타날 수 있습니다.

위대한 교차 플랫폼 라이브러리 (그러나 C++ 및 새로운 C++ 표준 후보)는 boost :: asio입니다.

네이티브 시스템 비동기 메서드를 사용합니다.

boost::asio

+1

C에서 이것을 수행 할 수있는 방법이 있습니까? Windows 또는 Linux 서버에서주의해야 할 사항은 무엇입니까? –

관련 문제