2012-03-16 16 views
8

Như tôi đã hiểu, bạn có thể tạo một mạng nonblockingsocket bằng PHP 5.x.Ổ cắm không chặn: Các thư có được xếp hàng đợi không?

Nhưng điều gì sẽ xảy ra nếu một kịch bản gửi nhiều tin nhắn dài bằng cách sử dụng ổ cắm nonblocking tương tự như sau:

socket_write($socket, $string1, $length); 
socket_write($socket, $string2, $length); 
socket_write($socket, $string3, $length); 
socket_write($socket, $string4, $length); 

Là những thông điệp trong hàng đợi (? Trên người gửi/bên nhận) hoặc là nó có thể rằng người nhận được các phần của các thông điệp khác nhau vì chúng đã gửi "song song"?

Ví dụ: Là Có thể là người nhận được 10 byte $ string1, sau đó 30 byte $ string2, sau đó thêm 25 byte $ chuỗi1 ... và vân vân ....

Trả lời

6

Nó phụ thuộc trên giao thức mà ổ cắm đang sử dụng. Xem socket_create để biết các loại ổ cắm có thể. Các loại chính là UDP và TCP:

udp các User Datagram Protocol là một kết nối, không đáng tin cậy, giao thức với độ dài kỷ lục cố định. Do những khía cạnh này, UDP yêu cầu số tiền giao dịch tối thiểu.

tcp Giao thức điều khiển truyền là giao thức song công đáng tin cậy, dựa trên kết nối, luồng, đầy đủ. TCP đảm bảo rằng tất cả các gói dữ liệu sẽ được nhận theo thứ tự mà chúng được gửi đi. Nếu bất kỳ gói nào bị mất bằng cách nào đó bị mất trong quá trình giao tiếp, TCP sẽ tự động truyền lại gói tin cho đến khi máy chủ đích xác nhận gói đó. Vì lý do độ tin cậy và hiệu suất, bản thân việc thực thi TCP quyết định ranh giới octet thích hợp của lớp giao tiếp datagram cơ bản. Do đó, các ứng dụng TCP phải cho phép khả năng truyền tải bản ghi một phần.

Để trả lời câu hỏi của bạn trực tiếp, các cổng TCP sẽ đảm bảo phân phối theo thứ tự, trong khi các ổ cắm UDP sẽ không.

+0

+1 Cũng xem http://stackoverflow.com/questions/1432477/can-php-asynchronously-use-sockets – msanford

+2

Điều đó có nghĩa là ví dụ của tôi ở trên: Ổ cắm TCP sẽ đảm bảo rằng người nhận sẽ không bao giờ thấy dữ liệu từ $ string2 , 3 hoặc 4 cho đến khi $ string1 được nhận hoàn toàn? – Mike

+2

Có, nhưng lưu ý rằng tất cả dữ liệu được ghi ra cùng một ổ cắm, do đó, người nhận sẽ thấy dữ liệu dưới dạng một luồng thông tin. Trừ khi bạn thêm chuỗi dài, dấu phân cách hoặc một số thông tin khác vào dữ liệu của bạn, người nhận sẽ không biết vị trí '$ string1' kết thúc và' $ string2' bắt đầu. –