linux下c++ socket 多线程问题
我写了一个socket的程序,客户端(也是linux平台)telnet ip地址 端口 后就能连上服务端
一开始我用fork实现客户端的并发问题
由于fork耗资源挺多的 就想把多进程改用多线程
结果改用多线程后遇到点问题 希望得到帮助:
当第一个用户连接后(现在还没退出) 第二个用户也连接上 然后第二个用户回车退出 结果第一个用户就不能正常退出 原因是client_fd被第二次连接的客户端给覆盖了 所以造成了第一个用户不能正常退出 现在的问题就是如何让第一个用户一按回车后能正常退出程序
代码:
int main()
{
...
...
while(1)
{
socklen_t sin_size;
int client_fd;
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr,&sin_size)) == -1)
{
cout<<"accept出错"<<endl;
exit(1);
}
cout<<"received a connection from "<<inet_ntoa(remote_addr.sin_addr)<<endl;
pthread_t id;
pthread_attr_t id_attr;
pthread_attr_init(&id_attr);
pthread_attr_setdetachstate(&id_attr,PTHREAD_CREATE_DETACHED);
cout<<"id: "<<id<<endl;
if (pthread_create(&id , &id_attr , thread, (void*)&client_fd) < 0 )//第二个用户一连 就覆盖前一个client_fd 怎么办?
{
cout<<"pthread_create error"<<endl;
}
}
}
void *thread(void *data)
{
pthread_detach (pthread_self ( ));
int *client_fd = (int*)data;
cout<<"thread *client_fd: "<<*client_fd<<endl;
string receive = "";
int recvbytes;
char buf[1024];
recvbytes = recv(*client_fd ,buf ,sizeof(buf) ,0);
cout<<"*client_fd 1:"<<*client_fd<<endl;
buf[recvbytes] = '\0' ;
receive = receive + buf;
close(*client_fd);
if(receive != "")
{
SplitString(receive);
}
pthread_exit(NULL);
}