Tôi đang cố gắng gửi dữ liệu qua số USOCKET. Khi dữ liệu đến máy chủ, máy chủ sẽ trả lời lại. Tuy nhiên, stream-read
(như được định nghĩa bên dưới) chỉ trả về dữ liệu khi dữ liệu được lặp lại với dữ liệu gốc được gửi. Ví dụ, nếu tôi gửi hello
và máy chủ trả lời với cùng một dữ liệu, hello
, thì stream-read
trả về, nhưng nếu máy chủ trả lời với hi
, stream-read
không trở lại cho đến khi máy chủ gửi bộ đệm chính xác mà nó nhận được.Nhận dữ liệu qua LISP USOCKET
Dưới đây là đoạn code: (Tôi đã tìm thấy hầu hết nó trực tuyến.)
;; Load USocket
(load #P"/usr/share/common-lisp/source/cl-asdf/asdf.lisp")
(asdf:operate 'asdf:load-op :usocket)
(defun stream-read (stream)
(socket-listen (usocket:socket-stream stream)))
(defun stream-print (string stream)
(write-line string (usocket:socket-stream stream))
(force-output (usocket:socket-stream stream)))
;; Define a stream
(defparameter my-stream
(usocket:socket-connect "127.0.0.1" 6003))
;; Use the stream
(stream-print "random" my-stream)
(print (stream-read my-stream))
Đối với các máy chủ, tôi đang sử dụng một phiên bản sửa đổi nhẹ của tăng chặn dụ máy chủ. (C++) Mã đầy đủ có thể được tìm thấy ở đây: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/echo/blocking_tcp_echo_server.cpp
...
void session(socket_ptr sock)
{
try
{
for (;;)
{
char data[max_length];
boost::system::error_code error;
size_t length = sock->read_some(boost::asio::buffer(data), error);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
std::vector<char> v(data,data+length);
std::string theStr;
for(unsigned int i=0;i<v.size();i++)
{
if(v[i]<32 || v[i]>=0x7f);//Remove non-ascii char
else theStr.insert(theStr.end(),v[i]);
}
std::cout<<"|"<<theStr<<"|"<<std::endl;
boost::asio::write(*sock, boost::asio::buffer(data, length)); //works
boost::asio::write(*sock, boost::asio::buffer("some", 4)); //doesn't work
}
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}
...
Cảm ơn, tôi đã thêm mã máy chủ vào bài đăng chính. –
Hình như máy chủ là vấn đề, thay thế nó bằng máy chủ echo C++ thực tế và mọi thứ hoạt động! http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/practical/ Ngoài ra, cảm ơn chức năng đọc ổ cắm, giờ đây nó đọc chính xác. –