2012-08-05 38 views
7

thực sự iam mã hóa ứng dụng android nhận được hình ảnh của webcam mà nó kết nối với máy tính. Để đạt được nhiều fps, tôi sử dụng giao thức udp thay vì tcp. Ý tưởng là, máy tính sẽ gửi hình ảnh đến ip và cổng của điện thoại. Nhưng nhà cung cấp điện thoại có các cổng công cộng khác nhau. vì vậy tôi không thể địa chỉ điện thoại trực tiếp. Đó là lý do tại sao tôi đã cố gắng để giải quyết vấn đề thông qua lỗ đục lỗ udp, nhưng điều đó đã không hoạt động. Khi điện thoại của tôi gửi một gói tin đến máy tính, máy tính sẽ nhận được ip và cổng công cộng của điện thoại. điều đó xảy ra mỗi giây để giữ cho mở khóa. Sau đó, máy chủ gửi khung webcame đến ip và cổng này nhanh nhất có thể. nhưng điện thoại chỉ nhận được 10-15 hình ảnh trong vòng 1-2 giây. sau đó nhà cung cấp dường như lọc tất cả các gói tin sau đây hoặc một cái gì đó như thế bởi vì điện thoại không nhận được bất kỳ gói tin nào nữa.Lỗi lỗ UDP không thể thực hiện được với nhà cung cấp dịch vụ di động

Bây giờ câu hỏi của tôi là: điều gì đang xảy ra (hoặc nhà cung cấp đang làm gì) và làm cách nào tôi có thể khắc phục sự cố này? Giao thức TCP hoạt động nhưng quá chậm để phát trực tuyến do quá nhiều lỗi và sửa lỗi.

+0

Các gói dữ liệu lớn bao nhiêu? –

+3

chúng khoảng 20k. nhưng tôi đã tìm thấy lý do cho điều này: tôi gửi quá nhiều gói trong một khoảng thời gian quá ngắn. Chúng đã được lưu trữ ở đâu đó trong ngăn xếp mạng của thiết bị vì thiết bị không thể xử lý chúng đủ nhanh. Bây giờ tôi chờ 75ms giữa mỗi gói và nó hoạt động như một say mê =) – Dano

+2

@Dano Nếu bạn tìm thấy một giải pháp chỉnh sửa câu trả lời của bạn hoặc trả lời câu hỏi của riêng bạn. Xin lỗi. –

Trả lời

9

Có một số vấn đề cần lưu ý với UDP, được phóng đại trên các mạng di động:

  • Như bạn đã biết, một khi bạn gửi một datagram UDP, có hoàn toàn không có sự đảm bảo rằng nó sẽ nhận được thông qua và không có cách nào chắc chắn để biết những gì đã xảy ra nếu nó không.

  • Tải trọng lớn hơn khoảng 1400 byte có thể được chia thành các đoạn IP. Hệ điều hành nhận có thể lắp ráp lại các gói đó vào toàn bộ gói, nhưng chỉ khi mọi mảnh đến. Một số bộ định tuyến thả các mảnh tùy ý, một số tường lửa thả các mảnh nếu chúng chứa các mẫu byte cụ thể và một số giới hạn tốc độ mà tại đó các đoạn có thể được gửi đi. Tốt nhất của nó là luôn luôn giữ datagrams của bạn nhỏ và xử lý reassembly và lặp đi lặp lại của phần còn thiếu mình.

  • Không có điều khiển luồng: nếu bộ đệm của bộ định tuyến đầy, mọi thứ sau đó sẽ bị xóa. Một số bộ định tuyến sẽ bắt đầu thả ngẫu nhiên một phần trăm các gói nếu bộ đệm của chúng đang phát triển nhưng chưa đầy. Một số tường lửa sẽ liệt kê một nguồn UDP nếu nó chạy nhanh hơn một số ngưỡng tùy ý.

Nói chung, các nhà sản xuất thiết bị và tường lửa có xu hướng đối xử với UDP như crap như vậy là một nhà phát triển UDP bạn phải thêm một công dân tốt để không bị đổ về: điều chỉnh dòng chảy của bạn, hãy nhớ rằng dropped packets có nghĩa là có lẽ bạn đi quá nhanh và giữ các gói nhỏ. Có rất nhiều thứ bạn có thể có được trong một môi trường được kiểm soát, nhưng nếu ứng dụng sẽ được triển khai "trong tự nhiên", nó sẽ mất rất nhiều chương trình cẩn thận để tránh các vấn đề.

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