socket API:accept方法没有设置sockaddr_in结构

时间:2016-03-10 14:43:47

标签: c sockets tcp

我正在开发客户端 - 服务器软件。在服务器端,我使用此代码:

int listener_socket = socket(AF_INET, SOCK_STREAM, 0);

if (listener_socket < 0)
{
   perror("opening socket error");
   return;
}

/* set option for reuseaddr */
int mtrue = 1;    
if(setsockopt(listener_socket,SOL_SOCKET,SO_REUSEADDR,&mtrue,sizeof(int)) != 0)
{
    perror("setsockopt error");
    return;
}

struct sockaddr_in serv_addr, cli_addr;


bzero((char *) &serv_addr, sizeof(serv_addr));
bzero((char *) &cli_addr, sizeof(cli_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);

/* bind socket */
if (bind(listener_socket,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
{
    perror("binding error");
return;
}

/* start listening */
listen(listener_socket,connections_limit);      

int newsockfd;

/* infinite cycle */
while(1){
      newsockfd = accept(listener_socket,(struct sockaddr*) &cli_addr,&clilen);
 ...
 }

所以我的代码在accept()方法中阻塞并等待新连接。当客户端连接时,accept方法返回正确的非负套接字描述符(我可以使用此描述符与客户端通信)但它不填充cli_addr结构。它仍然是零。为什么会这样?

1 个答案:

答案 0 :(得分:3)

我在接受之前忘记了这一行:

clilen = sizeof(cli_addr);