2010-09-10 25 views
6

Dưới đây là kịch bản:Có thể sử dụng các tệp dưới dạng kênh giao tiếp hai chiều giữa hai quy trình từ xa (loại "ổ cắm trên tệp") không?

  • Một người dùng có quyền truy cập vào hai máy

  • Những máy này không thể giao tiếp với ổ cắm mạng vì hạn chế tường lửa

  • Nhưng, cả hai đều có quyền truy cập vào chia sẻ mạng chung với quyền đọc/ghi trên máy thứ ba

Ques của tôi tion là: có thể viết một ứng dụng nhỏ được thực thi trên cả hai máy cho phép thiết lập một kênh giao tiếp giữa hai máy bằng cách chỉ sử dụng các tệp trên mạng chia sẻ? Lý tưởng nhất là nó sẽ mô phỏng luồng và hành vi ổ cắm.

tôi tưởng tượng rằng:

1) nó sẽ bao gồm có hai tập tin được sử dụng để giao tiếp, một cho mỗi hướng

2) và có khả năng để đọc một tập tin trong khi quá trình khác đang viết nó. .. qua mạng.

Nhưng tôi không chắc liệu nó có khả thi hay không, chủ yếu là vì tôi nghi ngờ về điểm 2). Có lẽ nó có thể trong môi trường giống Unix với NFS, mặc dù.

Có thể không? Nó đã tồn tại chưa?

Trả lời

2

Tôi nghĩ rằng nên chia luồng thành các gói trước tiên. Sau đó, các gói này sẽ xuất hiện dưới dạng tệp trong thư mục chung. Phải có hai "không gian tên" cho hai cách (a-> b và b-> a). Để gỡ lỗi dễ dàng, tên tệp phải chứa dấu thời gian, không chỉ là phần gia tăng.

Chỉ có một vấn đề với tệp: ngay cả khi tệp nhỏ, người nhận có thể nắm bắt tệp khi không hoàn toàn bị xóa, nghĩa là tệp chỉ được nửa chừng (trường hợp thông thường: 0 byte dài) hoặc mạng đã xảy ra lỗi trong quá trình chuyển. Tránh tình trạng này, các gửi nên:

  • tạo các tập tin trên một tên tạm thời,
  • viết nội dung, hãy đóng nó,
  • sau đó đổi tên nó để tên cuối cùng (với dấu thời gian, vv) .

Vì vậy, người nhận sẽ chỉ chọn tệp sau khi đổi tên, khi chắc chắn 100%, nó sẽ được ghi đầy đủ.

Trước khi gửi tệp mới, người gửi có thể kiểm tra tệp tạm thời, nếu có, có nghĩa là lần truyền cuối cùng bị hủy.

Khi tạo tệp truyền mới, người gửi nên tạo tệp thông tin chứa thông tin về gói truyền được gửi, do đó, khi phá thai, nó sẽ chứa thông tin về gói không thành công. Có lẽ, thông tin duy nhất là thời gian truyền (nhớ: tên tệp tạm thời không chứa dấu thời gian), nhưng nó tốt hơn là không có gì.

+0

Cảm ơn, tôi nghĩ rằng câu trả lời của bạn là một khởi đầu tốt. Các tập tin thông tin là một ý tưởng tốt quá, hoạt động như một cơ chế phát hiện lỗi. –

1

Làm thế nào về điều này:
Khi máy A muốn gửi một thông điệp tới máy B, nó tạo ra một tập tin gọi là _toBfromA_12782 (nơi 12782 là dấu thời gian hiện hành). Nó ghi nội dung vào tệp và sau đó thay đổi tên để xóa dấu gạch dưới đầu tiên.
Cứ sau vài giây, mọi máy sẽ kiểm tra xem có tệp nào có tên tệp bắt đầu bằng toX trong đó X là tên riêng của chúng. Nếu tìm thấy nhiều thư, chúng có thể được sắp xếp theo dấu thời gian. Sau khi đọc tập tin tin nhắn, người nhận sẽ xóa tập tin đó.
Điều này giả định rằng tất cả những người tham gia đều có thời gian được đồng bộ hóa nhưng nếu họ không làm như vậy cũng có thể được thực hiện (hoặc thực sự bị bỏ qua thực sự).

+0

Điều đó nghe có vẻ là một khởi đầu tốt. +1. Nhưng tôi nghĩ rằng các vấn đề đồng bộ hóa sẽ xuất hiện quá nhanh với nhiều tệp (các vấn đề về dấu thời gian). Cũng có "chặn" hành vi như với suối và ổ cắm có vẻ khó khăn. –

+1

Giải quyết đồng bộ hóa với ID tự động tăng dần trong tên tệp. Bằng cách đó bạn cũng có thể phát hiện thư bị mất. Có một cái nhìn tại các thiết bị hòa giải telcom. Đây là những kỹ thuật sử dụng như vậy để xử lý hàng loạt các tập tin dữ liệu sạc từ thiết bị chuyển mạch mạng. – Bernd

0

Tôi mơ hồ nhớ một số thứ về năm tệp trên UNIX. Một tìm kiếm trên web đã xác nhận rằng đó là những gì tôi nhớ (một cách để thực hiện giao tiếp thông qua các tập tin). Tôi đã không thử nghiệm để xem họ sẽ làm việc giữa hai máy khác nhau, có quyền truy cập vào hệ thống tập tin tương tự, nhưng tôi nghĩ rằng nó có thể sẽ. Tôi có thể có một đi nhạo báng cái gì đó sau này khi tôi có quyền truy cập vào một hệ thống Unix để thỏa mãn sự tò mò của tôi.

Về cơ bản, bạn phải tạo tệp FIFO, bằng cách sử dụng mkfifo. Sau đó, bạn có thể mở tệp và sử dụng chặn đọc/ghi để xử lý nó (mỗi 'mở' có thể đọc hoặc viết, không phải cả hai cùng một lúc, do đó bạn sẽ cần, một cho mỗi hướng). Một số mô tả khác về quy trình, bao gồm một số mẫu mã có thể được tìm thấy herehere.

Tôi đã thử nghiệm mkfifo, sử dụng lệnh chuẩn unix:

Tạo các đường ống:

mkfifo mypipe 

Viết tất cả mọi thứ từ một cửa sổ để các đường ống:

cat > mypipe 

đã đọc tất cả mọi thứ từ các đường ống để một cửa sổ khác:

cat mypipe 

Đường ống hoạt động như mong đợi, gõ vào một cửa sổ, nó xuất hiện trong cửa sổ kia, đáng buồn thay, điều này dường như chỉ hoạt động (ít nhất là đối với tôi), khi các tiến trình đang chạy trên cùng một máy, giúp đỡ với vấn đề của bạn. Nhưng tôi sẽ để lại câu trả lời trong trường hợp nó rất hữu ích để ai đó trong tương lai ...

+1

Như bạn đã tìm thấy, một FIFO trên phân vùng được gắn NFS ** sẽ không ** hoạt động như một cơ chế IPC giữa các máy. – Alnitak

+1

Thú vị! Quá xấu nó không hoạt động với các hệ thống tập tin mạng .. –

0

Có thể thử nếu một trong số các giải pháp này làm việc cho bạn, phụ thuộc nếu hệ thống mạng của bạn cho phép một trong những phương pháp giám sát được đề cập:

Monitoring a folder for new files in Windows

Tạo 2 thư mục, mỗi quá trình ghi vào một thư mục, sử dụng dấu thời gian cho tên tệp, viết ở chế độ độc quyền. Mỗi quá trình giám sát thư mục khác và khi một tập tin xuất hiện, bạn đợi cho đến khi nó được viết hoàn toàn, sau đó đọc nó, sau đó xóa nó.

+0

Giải pháp khá phức tạp và không đáng tin cậy khi chúng ta nghĩ về giao tiếp và đồng bộ hóa interprocess. – OnaBai

0

mmap() can be used to share a file between two processes, and is a classic IPC strategy và lịch sử một số triển khai hạt nhân của API bộ nhớ dùng chung sẽ sử dụng các inode tạm thời làm cửa hàng sao lưu.

Từ quan điểm của hạt nhân, sự khác biệt duy nhất trong trường hợp của bạn là tệp đang được sử dụng cho IPC sẽ sử dụng inodes sử dụng hệ thống con VFS để kết nối với chia sẻ NFS.

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