Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
套接字API:accept方法没有';t在结构中设置sockaddr__C_Sockets_Tcp - Fatal编程技术网

套接字API:accept方法没有';t在结构中设置sockaddr_

套接字API:accept方法没有';t在结构中设置sockaddr_,c,sockets,tcp,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_S

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

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);
 ...
 }
int-listener\u-socket=socket(AF\u-INET,SOCK\u-STREAM,0);
if(侦听器_套接字<0)
{
perror(“打开插座错误”);
返回;
}
/*为reuseaddr设置选项*/
int mtrue=1;
if(setsockopt(侦听器套接字、SOL套接字、SO\u REUSEADDR和mtrue、sizeof(int))!=0)
{
perror(“设置锁定选择错误”);
返回;
}
服务地址中的结构sockaddr\u,cli\u 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(端口号);
/*绑定套接字*/
if(bind(listener_socket,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
{
perror(“绑定错误”);
返回;
}
/*开始听*/
侦听(侦听器\u套接字、连接\u限制);
int newsockfd;
/*无限循环*/
而(1){
newsockfd=accept(侦听器\u套接字,(结构sockaddr*)和cli\u addr,&clilen);
...
}

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

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

clilen = sizeof(cli_addr);

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

clilen = sizeof(cli_addr);

clilen
是输入和输出参数。您正在初始化它吗?
clilen
是输入和输出参数。你正在初始化它吗?@FromReview:发问者对自己的问题给出答案是完全有效和可以接受的。是的,这个答案确实提供了一个合适的解决方案:“为什么accept不填充cli_addr?因为我忘了初始化clilen!”@FromReview:提问者发布自己问题的答案是完全有效和可以接受的。是的,这个答案确实提供了一个合适的解决方案:“为什么accept不填充cli_addr?因为我忘了初始化clilen!”。