2013-04-09 35 views
5

Tôi đang cố triển khai thuật toán dừng và chờ. tôi gặp sự cố khi triển khai thời gian chờ tại người gửi. Trong khi chờ ACK từ reciever, tôi đang sử dụng hàm recvfrom(). Tuy nhiên điều này làm cho chương trình nhàn rỗi, và tôi không thể làm theo thời gian chờ để truyền lại.Thực hiện Python cho Thuật toán Dừng và Chờ

đây là mã của tôi:

import socket 

import time 

mysocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 


while True: 


    ACK= " " 

    userIn=raw_input() 
    if not userIn : break 
    mysocket.sendto(userIn, ('127.0.0.01', 88))  
    ACK, address = mysocket.recvfrom(1024) #the prog. is idle waiting for ACK 
    future=time.time()+0.5 
    while True: 
      if time.time() > future: 
        mysocket.sendto(userIn, ('127.0.0.01', 88)) 
        future=time.time()+0.5 
      if (ACK!=" "): 
        print ACK 
        break 
mysocket.close() 

Trả lời

1

socket khối theo mặc định. Sử dụng hàm funcitons setblocking() hoặc settimeout() để kiểm soát hành vi này.

nếu bạn muốn thực hiện thời gian của riêng mình.

mysocket.setblocking(0) 
ACK, address = mysocket.recvfrom(1024) 

nhưng tôi sẽ làm điều gì đó như

import socket 

mysocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
mysocket.settimeout(0.5) 
dest = ('127.0.0.01', 88) 

user_input = raw_input() 

while user_input: 
    mysocket.sendto(user_input, dest)  
    acknowledged = False 
    # spam dest until they acknowledge me (sounds like my kids) 
    while not acknowledged: 
     try: 
      ACK, address = mysocket.recvfrom(1024) 
      acknowledged = True 
     except socket.timeout: 
      mysocket.sendto(user_input, dest) 
    print ACK 
    user_input = raw_input() 

mysocket.close() 
+0

Bạn thực sự không nên sử dụng một sản phẩm nào ngoại trừ khoản, trừ khi bạn đang rethrowing ngoại lệ. Bạn biết nó sẽ là một socket.timeout, vậy tại sao không bắt chỉ là một? – drxzcl

+0

@drxzcl chỉ cần thêm rằng;) – cmd

+0

'trong khi không được thừa nhận' thay vì' khi được thừa nhận' hoặc tôi đã bỏ lỡ điều gì đó? – mtahmed

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