2012-01-19 96 views
1

我會保持簡單。
代碼:C服務器套接字接受沒有請求的客戶端

#include "stdafx.h" 
    #include <winsock2.h> 
    #include <conio.h> 
    #include <iostream> 
    #include <stdio.h> 
    #include <tchar.h> 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    WSADATA wsadata; 
    int error = WSAStartup(0x0202, &wsadata); 
    if(error) printf("WinSock error!"); 
    SOCKET server; 
    struct sockaddr_in server_addr; 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(5657); 
    server_addr.sin_addr.s_addr = htonl (INADDR_ANY); 
    server = socket(AF_INET, SOCK_STREAM, 0); 
    if (server == INVALID_SOCKET) printf("INVALID SOCKET!"); 
    error = bind(server, (LPSOCKADDR)&server_addr, sizeof(server_addr)); 
    if(error) printf("Connect Error!"); 
    listen(server, SOMAXCONN); 
    printf("SERVER ESTABLISHED! LISTENING...\n"); 
    sockaddr_in client_addr; 
    SOCKET client; 
    client = accept(server, (struct sockaddr*)&client_addr, (int *)sizeof(client_addr)); 
    if(client==INVALID_SOCKET) printf("INVALID SOCKET!\n"); 
    printf("A CLIENT!"); 
    closesocket(server); 
    WSACleanup(); 
    getch(); 
    return 0; 
} 


但我得到的是:

服務器上設定!聆聽... 無效SOCKET! 客戶!

我已經在C#中完成了套接字,我猜服務器應該監聽並等待客戶端,並且每當客戶端請求連接時,服務器都應該接受它,但服務器不等待就接受套接字,這個接受的套接字也是無效的!爲什麼會發生這種情況,我該如何解決?

+1

WSAGetLastError()返回什麼? – hmjd

回答

4

此:

(int *)sizeof(client_addr) 

是錯誤的,你鑄造大小的指針。

socklen_t client_addr_len = sizeof(client_addr); 
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len); 
+0

該死!正在打字:) +1打我 – Tibo

+0

嗨。謝謝,但我發現socklen_t是未定義的!任何替代結構? – jzeus

+0

看起來像'int'應該很好:http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526%28v=vs.85%29.aspx(只需用'int替換'socklen_t' ',_not_'int *')。 –

1
(int *)sizeof(client_addr) 

你鑄造client_addr大小爲一個int *,所以你有一個指向它等於你client_addr大小的地址的指針。

你需要做的:

socklen_t clntAddrLen = sizeof(client_addr); 
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen); 

這種方式是不同的,因爲你有哪些握着你的client_addr的尺寸類型socklen_t的變量。然後你得到一個指針(指向&),它指向包含這個數字的內存地址,這是你想要的。

+0

嗨。謝謝,但我發現socklen_t是未定義的!任何替代結構?我正在使用Visual Studio 2010. – jzeus

+0

socklen_t類型是在Windows中的WS2tcpip.h中定義的。這不是從winsock2.h(AFAICT)傳遞的。您需要手動包含WS2tcpip.h才能使用socklen_t類型。 - 採取從http://stackoverflow.com/a/4454036/857994 –

1

問題可能是accept將嘗試寫入提供給它的最後一個參數。

更改爲:

int client_addr_size = sizeof(client_addr); 
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size); 

檢查的WSAGetLastError值將提供失敗的原因。

+0

謝謝,就是這樣! – jzeus

相關問題