C - 具有相同套接字的线程

时间:2014-06-10 21:27:54

标签: c multithreading sockets pthreads

我在使用套接字和线程时遇到了一些麻烦。我在主线程上有一个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);
}

...

0 个答案:

没有答案