2014-01-23 20 views
-1
SOCKET sock; 
SOCKET fd; 
uint16 port = 18001; 

void CreateSocket() 
{ 
    struct sockaddr_in server, client; // creating a socket address structure: structure contains ip address and port number 
    WORD wVersionRequested; 
WSADATA wsaData; 
int len; 

    printf("Initializing Winsock\n"); 


    wVersionRequested = MAKEWORD (2, 2); 
    iResult = WSAStartup (wVersionRequested, &wsaData);  
if (iResult != NO_ERROR) 
    printf("Error at WSAStartup()\n"); 


    // create socket 
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (sock < 0) { 
     printf("Could not Create Socket\n"); 
     //return 0; 
    } 

    printf("Socket Created\n"); 




    // create socket address of the server 
    memset(&server, 0, sizeof(server)); 
    // IPv4 - connection 
    server.sin_family = AF_INET; 
    // accept connections from any ip adress 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 
    // set port 
    server.sin_port = htons(18001); 


    //Binding between the socket and ip address 
    if(bind (sock, (struct sockaddr *) &server, sizeof(server)) < 0) 
    { 
     printf("Bind failed with error code: %d", WSAGetLastError()); 
    } 

    //Listen to incoming connections 
    if(listen(sock,3) == -1){ 
     printf("Listen failed with error code: %d", WSAGetLastError()); 
    } 

    printf("Server has been successfully set up - Waiting for incoming connections"); 

    for(;;){ 
     len = sizeof(client); 
     fd = accept(sock, (struct sockaddr*) &client, &len); 

     if (fd < 0){ 
      printf("Accept failed"); 
      close(sock); 
     } 
     //echo(fd); 
     printf("\n Process incoming connection from (%s , %d)", inet_ntoa(client.sin_addr),ntohs(client.sin_port)); 
//closesocket(fd); 
    } 

} 

服務器代碼正在通過IP地址和端口號接受來自客戶端的連接。它僅在第一次連接期間向客戶端發送SYN/ACK,並且第二次發送如下:RST/ACK(第二次復位)。爲什麼我的TCP服務器代碼只在第一個數據包或僅在第一個連接上發送SYN/ACK?

任何人都可以告訴我什麼是上述代碼中的錯誤?

+0

如果您在這些電話中遇到任何錯誤,那麼就沒有必要像繼續那樣繼續。 – EJP

+0

你能告訴我那是什麼嗎?我想這樣做三次以啓動我的客戶。 – user3189297

+0

我可以告訴你什麼*什麼是確切的? – EJP

回答

-1

Accept multiple subsequent connections to socket

這裏有一個名言:「爲了服務多個客戶端,你需要避免阻塞I/O - 也就是說,你不能僅僅從插座和塊,直到數據來自於閱讀。 「

+0

非常感謝。我試過非阻塞模式:iResult = ioctlsocket(sock,FIONBIO,&iMode);現在我在wireshark中遇到了一個問題:首先連接沒問題。在第二個連接中:SYN(主機到從機),SYN,ACK(從機到主機),ACK(主機到從機),ACK(從機到主機)以及主機到從機再次發送ACK等。我連續收到三到四次的確認。這是什麼原因? – user3189297

+0

報價不正確。如果您爲每個客戶端啓動一個線程,則不需要避免阻止I/O。 – EJP

相關問題