2013-01-10 14 views
12

Tôi đang sử dụng thư viện libwebsocket C của warmcat cho một máy chủ websocket nhỏ. Tôi có các ví dụ lên và làm việc và có thể gửi dữ liệu để đáp ứng với việc nhận dữ liệu từ websocket (chẳng hạn như lặp lại các byte đã đảo ngược được gửi). Tuy nhiên, tôi đã không thể tìm ra cách gửi dữ liệu không đồng bộ từ máy chủ mà không có trong chức năng gọi lại libwebsocket. Tôi cần con trỏ wsi để vượt qua để libwebsocket_write() nhưng không thấy làm thế nào để có được con trỏ ngoại trừ trong khi trong callback.Làm cách nào để gửi dữ liệu không đồng bộ qua libwebsocket?

Tôi đã đọc rằng libwebsocket không phải là chủ đề an toàn, vì trải nghiệm của riêng tôi dường như đã xác nhận.

Trong libwebsockets.c: line2483, tôi đọc rằng "Các hàm gọi lại giao thức được [...] được gọi định kỳ để cho phép truyền không đồng bộ." Đây là chính xác những gì tôi muốn nhưng tôi đã không quan sát thấy điều này xảy ra trong mã của riêng tôi và đã không tìm thấy bất kỳ cách nào để "biến nó trên".

Gợi ý về cách viết không đồng bộ với websocket tôi đang phân phối?

Mã cho libwebsocket: http://git.warmcat.com/cgi-bin/cgit/libwebsockets/

Ví dụ về sử dụng: http://martinsikora.com/libwebsockets-simple-websocket-server

Trả lời

8

tôi đã không tìm thấy một cách siêu sạch làm điều đó. Những gì tôi sẽ đề nghị là để đăng ký một cuộc gọi lại trên các sự kiện mà máy chủ có thể viết cho khách hàng và sau đó kiểm tra xem có công việc không đồng bộ để gửi ở đó. sự kiện LWS_CALLBACK_SERVER_WRITEABLE chỉ là vậy và nếu bạn gọi libwebsocket_callback_on_writable(context, wsi); từ trong cuộc gọi lại, nó sẽ được gọi định kỳ.

Vì vậy, một cái gì đó như thế này:

static int callback_myprotocol(struct libwebsocket_context *context, 
           struct libwebsocket *wsi, 
           enum libwebsocket_callback_reasons reason, 
           void *user, void *in, size_t len) 
{ 
    SendState *ss = (SendState*)user; 

    switch (reason) { 
    case LWS_CALLBACK_ESTABLISHED: 
     printf("connection established\n"); 
     // get the ball rolling 
     libwebsocket_callback_on_writable(context, wsi); 
     break; 

    case LWS_CALLBACK_SERVER_WRITEABLE: { 
     if (!work_to_be_done) { 
      // schedule ourselves to run next tick anyway 
      libwebsocket_callback_on_writable(context, wsi); 
      return 0; 
     } 
     // send our asynchronous message 
     libwebsocket_write(wsi, buf, size, flag); 
     // and schedule ourselves again 
     libwebsocket_callback_on_writable(context, wsi); 
     break; 
    } 
    default: 
     break; 
    } 

    return 0; 
} 

tôi thích nghi này từ ví dụ test-fraggle.c; ở trên là khoảng những gì mà ví dụ nào để gửi tin nhắn trong khối nhỏ hơn.

+0

Ngoài ra đối với bất kỳ ai viết máy khách C WebSocket thay vì máy chủ, sự kiện 'LWS_CALLBACK_CLIENT_WRITEABLE' được gọi thay vì' LWS_CALLBACK_SERVER_WRITEABLE'. – JasonCG

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