我在使用套接字和线程时遇到了一些麻烦。我在主线程上有一个poll实现,它监听所有新连接。当客户端连接到我的服务器时,我将此套接字保存在结构上以及我需要的更多内容,然后将此结构存放在与另一个线程共享的列表中。每当我启动程序时,该线程就会开始。 问题是,当我尝试通过之前保存的套接字在第二个线程上发送一些东西时,errno说“Bad File Descriptor”
有什么想法吗?
谢谢!
mainThread
void main() {
pthread_t secondThread;
...
while(1) {
poll(programs, BACKLOG,TIMEOUT);
if (programs[0].revents == POLLIN)
{
index = accept_connection(&programs[1], &programs[0].fd,BACKLOG,1);
char* file = receive_program(programs[1].fd,bufsize);
if (strlen(file) >0) {
t_newProgram* program = new_program(file,programs[index].fd);
pthread_mutex_lock(&mutex);
list_add(list_of_programs,program);
pthread_mutex_unlock(&mutex);
}
programs[0].revents = 0;
} else {
int i;
for (i = 1; i < (BACKLOG + 1); i++) {
if (programs[i].revents == POLLIN) {
accept_connection(&programs[i], &programs[0].fd,BACKLOG,i);
char* file = receive_program(programs[i].fd,bufsize);
if(strlen(file) >0) {
t_newProgram* program = new_program(file,programs[i].fd);
pthread_mutex_lock(&mutex);
list_add(list_of_programs,program);
pthread_mutex_unlock(&mutex);
}
programs[i].revents = 0;
}
}
}
}
}
secondThread
...
void program_reject() {
pthread_mutex_lock(&mutex);
t_newProgram* prog = (t_newProgram*)list_get(list_of_programs,0);
pthread_mutex_unlock(&mutex);
int errno = 0;
socklen_t len = sizeof(errno2);
int retval = getsockopt(*(prog)->socketProg,SOL_SOCKET,SO_ERROR,&errno2,&len);
int size = strlen("Program rejected")+1;
setsockopt(*pu, SOL_SOCKET, SO_SNDBUF,&size, strlen("Program rejected")+1);
int sendVar = send(*pu,"Program rejected",strlen("Program rejected")+1,0);
if(sendVar == -1) {
puts(strerror(errno));
}
free(prog);
}
...