2014-04-06 60 views
0

我試圖創建一個UDP服務器,雖然沒有連接到它的客戶端,但它收到一個連接... (它在控制檯 - New Connection寫很多,所以我想它會得到一個新的連接突然...)試圖創建UDP服務器

#include <iostream> 
#include <string> 
#include <WinSock2.h> 
#include <ws2tcpip.h> 
#include <Windows.h> 

#pragma comment(lib, "ws2_32.lib") 

SOCKET ServerOn() 
{ 
SOCKET ListenSocket; 
WSADATA wsaData; 
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
if (iResult != NO_ERROR) 
{ 
    exit(0); 
} 

// Create a SOCKET for listening for 
// incoming connection requests. 
ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 
if (ListenSocket == INVALID_SOCKET) 
{ 
    WSACleanup(); 
    exit(1); 
} 

// The sockaddr_in structure specifies the address family, 
// IP address, and port for the socket that is being bound. 
sockaddr_in service; 
service.sin_family = AF_INET; 
service.sin_addr.s_addr = inet_addr("0.0.0.0"); 
service.sin_port = htons(2583); 

if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) 
{ 
    closesocket(ListenSocket); 
    WSACleanup(); 
    exit(2); 
} 

return ListenSocket; 
} 

int main() 
{ 
SOCKET ListenSocket = ServerOn(); 
SOCKET ClientSocket; 

sockaddr_in service; 
service.sin_family = AF_INET; 
service.sin_addr.s_addr = inet_addr("10.0.0.2"); 
service.sin_port = htons(2583); 

while(true) 
{ 
    if (ClientSocket = accept(ListenSocket, (SOCKADDR*)&service, NULL)) 
    { 
      std::cout << "New Connection!" << std::endl; 
    } 
} 
} 

爲什麼它沒有連接,我跑了什麼?也許別的東西試圖連接到我的服務器?

謝謝!

回答

1

兩件事:我不認爲你的服務器的IP地址可以是0.0.0.0,而是10.0.0.2;另外,UDP不支持「接受」的概念。只有數據包,您可以將套接字綁定到端口,然後接收來自特定IP的數據包(使用recvfrom),或者您可以接收來自任何人的數據包,並帶有recv。後者在服務器的情況下會很有用。請注意,您必須使用sockaddr_in結構手動跟蹤每個連接的客戶端。

+0

你應該使用'recvfrom'(http://linux.die.net/man/2/recvmsg)作爲UDP,'recv'通常只用於TCP – user3F31A28