2012-07-27 160 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)); 
相关问题