Bạn không thể gửi dữ liệu đến máy chủ từ xa trước khi nó bắt đầu kết nối. Điều đó không có ý nghĩa gì cả. Câu hỏi của tôi là: bạn có muốn thiết bị của mình kết nối với máy chủ từ xa không hoặc bạn có muốn máy chủ từ xa bắt đầu kết nối với thiết bị của mình không?
Ngay bây giờ bạn đang sử dụng netconn_accept trong thiết bị - điều đó có nghĩa là bạn đang đợi máy chủ từ xa bắt đầu kết nối với thiết bị của mình trước khi thiết bị có thể báo hiệu máy chủ từ xa. Đây là hành vi hoàn toàn mong đợi đối với mã bạn đã viết nhưng dường như bạn lo lắng về điều này. Đây không phải là ý định của bạn? Nếu không, tại sao bạn mã nó theo cách đó? Cách khác là để thiết bị của bạn khởi tạo kết nối với máy chủ từ xa. Có một ví dụ về việc sử dụng netconns here. Tất nhiên, điều này cũng liên quan đến những thay đổi đối với thiết bị khác trong hệ thống của bạn.
Vì vậy, đạo đức của câu chuyện đó là bạn không thể gửi bất kỳ dữ liệu nào khi không có kết nối và bạn đang chờ kết nối trước khi gửi dữ liệu. Bạn không muốn đợi kết nối, vì vậy bạn phải thay đổi phần mềm của mình để bắt đầu kết nối thay vì đợi phía bên kia bắt đầu kết nối.
Một vấn đề khác mà bạn có thể gặp phải là bạn muốn có thể gửi và nhận dữ liệu trên cùng một kết nối cùng một lúc. Hầu hết các ví dụ tôi thấy cho lwip liên quan đến việc chặn các cuộc gọi chờ dữ liệu, sau đó phản ứng lại dữ liệu đó bằng cách truyền lại một số thứ. Đôi khi bạn muốn truyền lại thứ gì đó mà không nhận được thứ gì đó trước. Tôi cũng có thể giúp với điều đó.
Đây là những gì đã hiệu quả đối với tôi khi tôi tạo kết nối netconn đang nghe.
Trước tiên, bạn phải kích hoạt bằng cách thiết lập timeout:
#define LWIP_SO_RCVTIMEO 1
Sau đó, bạn phải thiết lập netconn của bạn tương tự như này:
pxTCPListener = netconn_new (NETCONN_TCP);
netconn_bind (pxTCPListener, NULL, 23);
netconn_listen (pxTCPListener);
pxNewConnection = netconn_accept (pxTCPListener); // Khối này cho đến khi kết nối được chấp nhận
// Đây là dòng quan trọng!
pxNewConnection-> recv_timeout = 10; // lưu ý Đây là millseconds - lwip làm việc trong ms
// Đây vòng cho đến khi kết nối được đóng
while (ERR_IS_FATAL (pxNewConnection-> err)!) {// lỗi Fatal bao gồm các kết nối bị đóng cửa, thiết lập lại , hủy bỏ, vv
// gọi netconn_recv này bây giờ sẽ chờ 10ms đối với bất kỳ dữ liệu mới, sau đó trở về
if ((pxRxBuffer = netconn_recv (pxNewConnection))! = NULL) {
// Xử lý nhận d dữ liệu
}
// Ở đây, làm bất cứ truyền bạn muốn
} // Kết thúc vòng lặp while từ trên
Đó là mã sẽ cho phép bạn làm truyền và nhận tại đồng thời không lo lắng về việc chặn.
Vì tôi đang sử dụng FreeRTOS, hôm nay tôi đã cố gắng sử dụng hai luồng, một chủ đề đang chờ kết nối, một máy chủ khác làm máy khách để mở kết nối TCP khi cần. Các thread máy chủ đang làm tốt, nhưng ở phía khách hàng, nó luôn luôn trở về lỗi khi tôi gọi 'netconn_connect()' ... Tôi đã cố gắng sử dụng cùng một cổng khác nhau cho máy chủ và máy khách, nhưng vẫn thất bại – eepty