2017-01-24 8 views
0

Я пытаюсь создать прокси-сервер, который многопоточен. Я могу сделать однопоточное одно прекрасно, но когда я пытаюсь использовать многопоточность, он каждый раз бросает эту ошибку.Объект `member_descriptor` не может быть вызван на объект сокета

Traceback (most recent call last): 
    File "malwareProxy.py", line 25, in newClientInteraction 
    request = clientSocket.recv(BUFFLEN) 
TypeError: 'member_descriptor' object is not callable 

У меня есть этот импорт:

import sys 
import thread 
from socket import * 

И важные биты коды:

def newClientInteraction(clientSocket, addr): 
    try: 
     port = 80 

     request = clientSocket.recv(BUFFLEN) 
.... 
serverListener = socket(AF_INET, SOCK_STREAM) 
    serverListener.bind(("", serverPort)) 
    serverListener.listen(100) 
    print("\nProxy Server listening on port {0}...".format(serverPort)) 

    # Start to listen for connections 
    while True: 
     (newsocket, addr) = serverListener.accept() 
     print("Connection made from: {0}".format(newsocket.getpeername())) 

     thread.start_new_thread(newClientInteraction, (socket, addr)) 

Пожалуйста, помогите. Я довольно новичок в python и понятия не имею, почему я получаю эту ошибку. Я просмотрел некоторые сообщения об этой ошибке, и ответы, похоже, связаны с программистом, использующим несколько файлов и импорта. Я просто использую один файл. Спасибо.

+1

Когда вы запускаете поток, вы, кажется, проходят ** сокет ** в то время как вы создали __ (newsocket, addr) __ пара двух строк выше. Попробуйте передать ** newsletter ** в вызове __thread.start_new_thread__. – sal

+0

Я действительно глуп! Спасибо. –

+1

Нет, нет. Это неудачная орфографическая ошибка. Я добавил ответ: пожалуйста, примите его, если правильно. :) – sal

ответ

1

Ошибка связана с неудачной опечаткой при передаче параметров при запуске новой нити. Несчастливо потому что оно соответствует имени в сокете библиотеке, таким образом, сгенерированная ошибка сложнее отлаживать.

Сообщение об ошибке может быть воспроизведен пытается вызвать:

import socket 
socket.socket.recv(BUFFLEN) 

что и что опечатка производит. К счастью, это легко исправить, изменив эту строку:

thread.start_new_thread(newClientInteraction, (socket, addr)) 

читать вместо

thread.start_new_thread(newClientInteraction, (newsocket, addr)) 
+0

Можете ли вы объяснить, что такое 'member_descriptor'? У меня также есть аналогичная проблема, но с 'cur_time = cur_time + timedelta.seconds (1)' <- Я не думаю, что это имеет какое-то отношение к сокетам ... –

+0

Обновление: Кажется, мне нужно использовать 'cur_time = cur_time + timedelta (seconds = 1) '. Однако я все еще запутался, почему есть 'member_descriptor' там ... –

 Смежные вопросы

  • Нет связанных вопросов^_^