2012-07-27 198 views
0

從下面的代碼中,我需要添加什麼代碼才能知道客戶端何時連接到服務器? 謝謝! :d您如何知道客戶端何時連接到服務器?

int sd, rc; 
socklen_t cliLen; 
struct sockaddr_in cliAddr, servAddr; 
char* argv = (char*) arg; 

/* socket creation */ 
sd=socket(AF_INET, SOCK_DGRAM, 0); 
if(sd<0) 
{ 
    printf("%s: cannot open socket \n",argv); 
    // exit(1); 
} 

/* bind local server port */ 
servAddr.sin_family = AF_INET; 
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
servAddr.sin_port = htons(LOCAL_SERVER_PORT); 
rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); 
if(rc<0) 
{ 
    printf("%s: cannot bind port number %d \n", 
    argv, LOCAL_SERVER_PORT); 
    // exit(1); 
} 

printf("%s: waiting for data on port UDP %u\n",argv,LOCAL_SERVER_PORT); 

while(1) 
{ 
    /* init buffer */ 
    memset(msg,0x0,MAX_MSG); 


    /* receive message */ 
    n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *) cliAddr,sizeof(cliAddr)); 
} 

由於這是通過UDP(連接)來完成,我們無法知道什麼時候該客戶端已連接。有沒有辦法讓我們知道誰發送了數據?

+1

UDP添加

printf("Recieved data"); 

是無連接的;沒有人「連接」。當你得到數據時,你知道你有數據。 – 2012-07-27 07:36:13

+1

從技術上講,一個「連接()」只發生在流(在3路TCP握手成功並且你的服務器的「accept()」給你一個新的套接字之後)。 *無*這發生在數據報。你的代碼看起來很好。 – paulsm4 2012-07-27 07:37:55

+0

@BrianRoach感謝您的回覆!有沒有什麼方法可以確定誰將數據發送到服務器?因爲我需要做diffie-hellman協議來交換密鑰,然後在發送給用戶時加密數據。 – mister 2012-07-27 07:40:39

回答

3

您正在使用指示UDP套接字的SOCK_DGRAM

UDP不像TCP,沒有真正的「連接」,只是發送數據包和希望他們達到目標。

但是,如果你想顯示接收的東西的事實,你可以以後

n = recvfrom(sd, msg, MAX_MSG, 0,(struct sockaddr *) cliAddr,sizeof(cliAddr)); 
相關問題