2010-05-23 6 views
-1

최대 20 자의 문자열을 받고 화면에 해당 문자열을 인쇄하는 간단한 프로그램을 작성하려고합니다.bind()는 Windows 소켓 오류로 인해 실패합니다. 10038

) 코드는 컴파일,하지만 난 (바인드를 얻을 실패 : 10038.을 MSDN (nonsocket에 소켓 작업)에 오류 번호를 찾고 후, 나는

int sock; 

에서 일부 코드를 변경

SOCKET sock 

차이를 만들어서는 안되지만 결코 알 수 없습니다.

여기에 코드입니다 :

#include <iostream> 
#include <winsock2.h> 
#include <cstdlib> 
using namespace std; 

const int MAXPENDING = 5; 
const int MAX_LENGTH = 20; 

void DieWithError(char *errorMessage); 

int main(int argc, char **argv) 
{ 
    if(argc!=2){ 
    cerr << "Usage: " << argv[0] << " <Port>" << endl; 
    exit(1); 
    } 

    // start winsock2 library 
    WSAData wsaData; 
    if(WSAStartup(MAKEWORD(2,0), &wsaData)!=0){ 
    cerr << "WSAStartup() failed" << endl; 
    exit(1); 
    } 

    // create socket for incoming connections 
    SOCKET servSock; 
    if(servSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)==INVALID_SOCKET) 
    DieWithError("socket() failed"); 

    // construct local address structure 
    struct sockaddr_in servAddr; 
    memset(&servAddr, 0, sizeof(servAddr)); 
    servAddr.sin_family = AF_INET; 
    servAddr.sin_addr.s_addr = INADDR_ANY; 
    servAddr.sin_port = htons(atoi(argv[1])); 

    // bind to the local address 
    int servAddrLen = sizeof(servAddr); 
    if(bind(servSock, (SOCKADDR*)&servAddr, servAddrLen)==SOCKET_ERROR) 
    DieWithError("bind() failed"); 

    // mark the socket to listen for incoming connections 
    if(listen(servSock, MAXPENDING)<0) 
    DieWithError("listen() failed"); 

    // accept incoming connections 
    int clientSock; 
    struct sockaddr_in clientAddr; 
    char buffer[MAX_LENGTH]; 
    int recvMsgSize; 

    int clientAddrLen = sizeof(clientAddr); 
    for(;;){ 
    // wait for a client to connect 
    if((clientSock=accept(servSock, (sockaddr*)&clientAddr, &clientAddrLen))<0) 
     DieWithError("accept() failed"); 
    // clientSock is connected to a client 


    // BEGIN Handle client 
    cout << "Handling client " << inet_ntoa(clientAddr.sin_addr) << endl; 
    if((recvMsgSize = recv(clientSock, buffer, MAX_LENGTH, 0)) <0) 
     DieWithError("recv() failed"); 

    cout << "Word in the tubes: " << buffer << endl; 
    closesocket(clientSock); 

    // END Handle client 
    } 
} 

void DieWithError(char *errorMessage) 
{ 
    fprintf(stderr, "%s: %d\n", errorMessage, WSAGetLastError()); 
    exit(1); 
} 

답변

2

문제는 당신이이하는 생각으로 연결하지 않습니다

servSock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)==INVALID_SOCKET 

함께. 왜 그런 식으로 쓸 것인가?

SOCKET servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if(servSock == INVALID_SOCKET) 
    DieWithError("socket() failed"); 

?

+0

도움을 주셔서 감사합니다! 나는 자습서에서 (손으로) 복사하고 있었다. 당신 말이 맞아요, 그 선은 못 생겼어. – lowerkey

관련 문제