【问题标题】:socket API: accept method didn't set sockaddr_in structure套接字 API:accept 方法没有设置 sockaddr_in 结构
【发布时间】:2018-07-17 12:17:52
【问题描述】:

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

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 结构。它仍然为零。为什么会这样?

【问题讨论】:

  • clilen 既是输入参数又是输出参数。你在初始化它吗?

标签: c sockets tcp


【解决方案1】:

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

clilen = sizeof(cli_addr);

【讨论】:

  • @FromReview:提问者发布自己问题的答案是完全有效和可以接受的。是的,这个答案确实提供了一个合适的解决方案:“Why accept doesn't fill cli_addr? because I forgot to initialize clilen!”。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 2012-07-25
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多