Chỉnh sửa: Xin lỗi, vô tình được đăng với tiêu đề cho một câu hỏi khác. Đã sửa.Không thể đọc từ ổ cắm (treo)
Hey guys,
Tôi đang sử dụng PHP để kết nối với một máy chủ C ổ cắm địa phương ++ để giữ trạng thái giữa một ứng dụng web và một vài daemon. Tôi có thể gửi dữ liệu đến máy chủ socket nhưng không nhận được dữ liệu từ nó; nó chỉ chặn trên socket_read()
và treo vô thời hạn. Tôi quên một cái gì đó câm (giống như một nhân vật NULL hoặc một sự kết hợp khác nhau của các ký tự dòng mới)? PHP là dưới đây:
socket_connect($sock, $addr, $port);
socket_write($sock, 'Hello world');
$str = '';
while($resp = socket_read($sock, 1000))
$str .= $resp;
socket_close($sock);
die("Server said: {$str}");
Phần liên quan của máy chủ socket nằm dưới (lưu ý <<
và >>
nhà khai thác đang quá tải):
std::string data;
sock >> data;
sock << data << std::endl;
đâu >>
cuộc gọi Socket::recv(std::string&)
và >>
cuộc gọi Socket::send(const std::string&)
.
Điều này làm việc tốt từ (ví dụ) telnet, nhưng PHP không muốn chơi tốt. Bất kỳ suy nghĩ/đề xuất được đánh giá cao.
Bạn đang sử dụng thư viện socket nào cho C++ hoặc bạn đã tạo riêng của mình (* nix hoặc Windows)? Ngoài ra, lỗi là gì? Có phải nó chỉ chặn vĩnh viễn trên sock >> dữ liệu hoặc là một cái gì đó nhiều hơn xảy ra? Tôi đã không được sử dụng giao tiếp PHP với một máy chủ C + + trong một thời gian, nhưng là máy chủ của bạn gửi một chấm dứt vào ổ cắm để nó nói với PHP để ngừng đọc? Vòng lặp của bạn sẽ đọc liên tục trong PHP cho đến khi máy chủ thông báo rằng socket được thực hiện gửi thông tin; nó không phải là một cập nhật thời gian thực tâm trí bạn (kể từ khi nó in dữ liệu sau khi nó đã được hoàn toàn thu thập và lưu trữ trong bạn var). – RageD
Điều này có thể bị thiếu trong mã của bạn, nhưng bạn có 'socket_create' $ sock trước không? – netcoder
Ngoài ra, tôi không thấy điều này trong mã của bạn, nhưng bạn sẽ cần in $ str khi vòng lặp của bạn hoàn tất. – RageD