2010-05-23 45 views
5

Tôi đang cố gắng viết một ứng dụng dựa trên socket đơn giản bằng Python sẽ kết nối với máy chủ telnet. Tôi có thể kiểm tra máy chủ bằng cách telnetting đến cổng của nó (5007), và nhập văn bản. Nó đáp ứng với một NAK (lỗi) hoặc AK (thành công), đôi khi đi kèm với văn bản khác. Có vẻ rất đơn giản.Kết nối ổ cắm với máy chủ dựa trên telnet treo trên đọc

Tôi đã viết một khách hàng để kết nối và giao tiếp với máy chủ, nhưng nó bị treo trên nỗ lực đầu tiên để đọc phản hồi. Kết nối thành công. Các truy vấn như getockname và getpeername thành công. Lệnh gửi trả về một giá trị bằng với số ký tự tôi đang gửi, vì vậy nó có vẻ đang gửi đúng. Nhưng cuối cùng, nó luôn luôn treo khi tôi cố đọc phản hồi.

Tôi đã thử sử dụng cả hai đối tượng dựa trên tệp như readline và write (qua socket.makefile), cũng như sử dụng gửi và recv. Với đối tượng tập tin tôi đã thử làm cho nó với "rw" và đọc và viết thông qua đối tượng đó, và sau đó đã thử một đối tượng cho "r" và một đối tượng khác cho "w" để tách chúng ra. Không ai trong số này làm việc.

Tôi đã sử dụng gói sniffer để xem những gì đang diễn ra. Tôi không thông thạo tất cả những gì tôi thấy, nhưng trong một phiên telnet tôi có thể thấy văn bản đã nhập của tôi và văn bản của máy chủ sẽ trở lại. Trong kết nối socket Python của tôi, tôi có thể thấy văn bản của tôi sẽ đến máy chủ, nhưng các gói tin lại dường như không có bất kỳ văn bản nào trong đó.

Bất kỳ ý tưởng nào về những gì tôi đang làm sai hoặc bất kỳ chiến lược nào để thử?

Dưới đây là đoạn code tôi đang sử dụng (trong trường hợp này, nó có gửi và recv):

#!/usr/bin/python 

host = "localhost" 
port = 5007 
msg = "HELLO EMC 1 1" 
msg2 = "HELLO" 

import socket 
import sys 

try: 
    skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
except socket.error, e: 
    print("Error creating socket: %s" % e) 
    sys.exit(1) 

try: 
    skt.connect((host,port)) 
except socket.gaierror, e: 
    print("Address-related error connecting to server: %s" % e) 
    sys.exit(1) 
except socket.error, e: 
    print("Error connecting to socket: %s" % e) 
    sys.exit(1) 

try: 
    print(skt.send(msg)) 
    print("SEND: %s" % msg) 
except socket.error, e: 
    print("Error sending data: %s" % e) 
    sys.exit(1) 


while 1: 
    try: 
     buf = skt.recv(1024) 
     print("RECV: %s" % buf) 
    except socket.error, e: 
     print("Error receiving data: %s" % e) 
     sys.exit(1) 
    if not len(buf): 
     break 
    sys.stdout.write(buf) 

Ồ, trong trường hợp đó là hữu ích, đây là một phiên dụ telnet thực hiện bằng tay:

ubuntu:~/mac/python$ telnet localhost 5007 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
HELLO EMC 1 1 
HELLO ACK EMCNETSVR 1.1 

Dòng 'HELLO' đầu tiên là thứ tôi đã nhập, dòng thứ hai là câu trả lời.

Trả lời

7

Bạn có thể cần phải chấm dứt msg của bạn với một số loại "ký tự kết thúc dòng" - có lẽ là \r\n, có lẽ chỉ là một trong hai. Khi bạn đang ở trong telnet, bạn đã không chấm dứt văn bản đã nhập của mình bằng cách nhấn phím Trả lại hoặc Enter? Trong mã Python, bạn không làm tương đương với điều đó.

+0

tuyệt vời, các \ r đã làm các trick! tôi đã thử \ n trước đó (không hoạt động) nhưng không nhận thức được \ r. tuôn ra cũng không cần thiết. cảm ơn! – mix

+1

hóa ra tôi cần \ r \ n, không chỉ \ r. \ r hoạt động trong một số trường hợp, nhưng không phải trong tất cả, điều này gây nhầm lẫn. \ n tự nó không hoạt động. – mix

0

Bạn cần phải flush ổ cắm ngay sau send, để buộc ngăn xếp TCP thực sự gửi dữ liệu. Nếu không, nó sẽ chờ đợi thêm dữ liệu để gửi, để điền vào một gói dữ liệu một cách hiệu quả. Trong khi bạn đang chờ phản hồi từ máy chủ thì không có gì thực sự được gửi.

+0

Tôi đã thử xóa() trên phiên bản đối tượng tệp, không có thay đổi về hành vi. Dường như không có phương thức flush() cho socket hoạt động với socket.write (?). – mix

Các vấn đề liên quan