2016-10-24 3 views
0

서버 클라이언트 응용 프로그램을 만들 때 아래 코드에서 소켓 메시지를 열지 못했습니다. 아래 예제 코드를 참조하십시오. 소켓 오류에 대한 문서

if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0){ 
    qDebug() << "ERROR netserver: binding to socket"; 
    //more code here 
} 

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if (sockfd < 0){ 
    qDebug() << "ERROR netserver: opening socket"; 
    //more code here 
} 

또는

은 내가 getLastError()를 사용하여 C++의 devs 알고있다 그러나 나는 소켓 종류의 아무것도 찾을 수 없습니다.

누구나 페이지/튜토리얼/위키를 알고 있습니까?

+2

구글 (내 기억 창 유사한 명령을 가지고). Windows에서 WSA_GetLastError. Qt는 그것들을 감싸는 래퍼를 가질 수 있습니다. –

+3

우선, Qt를 사용하는 이유는 [Qt 네트워크 클래스] (http://doc.qt.io/qt-5/qtnetwork-index.html)를 사용하지 않는 이유는 무엇입니까? 둘째, 하위 레벨 소켓 함수를 계속 사용한다면 오류를 얻는 방법은 플랫폼에 따라 다릅니다. POSIX 시스템 (Linux 나 macOS 같은)에서는'errno'를 체크 할 필요가 있습니다. Windows에서는'WSAGetLastError'를 사용해야합니다. 또한, POSIX 시스템을 사용하고 있다면 수동 페이지 *를 사용하십시오! (콘솔에서는 [man man'] (예 :'man bind')와 같은 명령을 사용하십시오. –

+0

@ n.m. 내가 전에이 키워드들을 발견하지 못했기 때문에, 당신이 이것에 대해 어떻게 알 수 있느냐? – KGCybeX

답변

0

바인드/오픈 소켓에 실패하면 일반적으로 (개발자가 아닌) 시스템 오류가 발생합니다. 이것들은 언제나 잘보고 된 것은 아닙니다 : (

그 이유는 소켓이 이미 수신되고있는 경우 (즉, 동일한 프로그램의 두 번째 인스턴스를 실행하려는 경우) 또는 이전 소켓 이전 프로그램/인스턴스가 종료 된 후 OS가 제대로 닫지 않은 경우 마지막 문제를 해결하는 여러 가지 방법이 있지만 첫 번째 문제가 아닌지 확인하십시오.)

이러한 유형의 오류는 요청 된 포트가 특권 포트, 즉. 1024 이하의 어떤 것도 루트 (유닉스에서) 타입 권한을 필요로합니다. errno를, strerror는, perror는 : 유닉스에

"에서 netstat -an은"이 친구는