while(1) { if(-1 == (clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len) ) ) { perror("accept"); return -1; } printf("IP: %s connected !\n", inet_ntoa(clientaddr.sin_addr) ); pthread_attr_t attr; pthread_attr_init(&attr); pthread_t tid; pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&tid,&attr, myrutine, (void*)clientfd); printf("thread runing...........\n"); } 错误如何修改
时间: 2024-02-06 17:11:12 浏览: 133
开发过程文档 1
这段代码主要是一个TCP服务器的实现,当一个客户端连接到服务器时,创建一个新的线程来处理客户端的请求。代码中的while(1)循环会持续监听客户端连接,如果有新的客户端连接,就会创建一个新的线程来处理它。
从代码中看,可能存在以下几个问题:
1.代码中没有对len变量进行初始化,应该在accept()函数调用之前将变量值设置为客户端地址结构体的大小。
2.在创建新线程之前,应该检查pthread_create()函数的返回值,以确保线程创建成功。
3.在myrutine()函数中,可能需要检查传递给它的参数是否正确,特别是clientfd是否为有效的描述符。
可以尝试修改代码如下:
```
while(1) {
len = sizeof(struct sockaddr_in);
if(-1 == (clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len) ) ) {
perror("accept");
return -1;
}
printf("IP: %s connected !\n", inet_ntoa(clientaddr.sin_addr) );
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_t tid;
if(pthread_create(&tid,&attr, myrutine, (void*)clientfd) != 0) {
perror("pthread_create");
return -1;
}
printf("thread running...........\n");
}
```
请注意,这里添加了对pthread_create()函数的返回值进行检查的代码,以确保线程创建成功。同时,对len变量进行了初始化,并且在调用myrutine()函数之前没有对clientfd进行任何处理,因此需要在myrutine()函数中进行参数检查和处理。
阅读全文