Websocket karşılıklı yanıtı TCP'den istemciye iletilmedi


0

Bir websocket sunucusu oluşturmaya çalışıyorum. Websocket istemcisinin açılış anlaşmasını görebiliyorum. Buna cevabım istemci laptop tarafından alındı ​​(bunu wireshark'ta görebiliyorum). Böylece TCP bağlantısı kuruldu. Ancak istemci (bir krom websocket istemcisi uzantısı) el sıkışma paketini almıyor. TCP'nin el sıkışmasını istemciye iletmemesi veya istemcinin TCP iletisini okuyamama olasılığı ne olabilir?

Müşteri el sıkışma:

GET HTTP/1.1
Upgrade: websocket
Connection:Upgrade
Cache-Control:no-cache
Host:192.168.0.101
Origin:http://www.websocket.org
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key: qrmw/m+BoZije6h9HYKmVw==
Sec-WebSocket-Version:13
Upgrade:websocket

Sunucu Yanıtı:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: jj1g5Io57m9ks8cme3jkbyo2asc=
Access-Control-Allow-Origin: http://www.websocket.org
Server: xyz
Sec-WebSocket-Extensions: 

Teşekkürler!

Yanıtlar:


1

WebSockets spec göre boş Sec-WebSocket-Extensions başlığa izin verilmez ve hatalı biçimlendirilmiş veriler olarak kabul edilir ve "böyle hatalı biçimlendirilmiş verilerin alıcısı derhal GEREKİR WebSocket Bağlantısını Kesin . "(onların vurgusu)

http://tools.ietf.org/html/rfc6455#section-9.1

WebSockets sunucunuz bu uzantıların hiçbirini desteklemiyorsa, bu başlığı eklemek yerine hatalı biçimlendirilmiş (boş) bırakmak yerine bu başlığı atlamalısınız. Spesifikasyonun başka bir yerinde, istemcinin, sunucunun yanıtında bu başlık yoksa, destek uzantıları listesini boş bulması gerektiğini belirtir.

Eklemek için güncellendi:
Ben de sunucunuzun olduğuna inanıyorum Sec-WebSocket-Accept çıktı yanlış.

Almak için aşağıdaki kabuk işlevini yazdım Sec-WebSocket-Key değer ve hesaplayın Sec-WebSocket-Accept ondan

wscalc () {
    WSGUID="258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
    echo -n "${1}${WSGUID}" | openssl sha1 -binary | openssl base64
}

Bunu WebSockets teknik özelliklerinden örnek ile test ettim. RFC6455 ve doğru değeri alır:

$ wscalc dGhlIHNhbXBsZSBub25jZQ==
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Ama bunu müşterinin müşterisinde çalıştırdığımda Sec-WebSocket-Key, Sunucunuzun içine koymaktan farklı bir değer alıyorum. Sec-WebSocket-Accept:

$ wscalc 'qrmw/m+BoZije6h9HYKmVw=='
B18B9fmlWz7D6Gu9eCWRNkcB1II=

Bunu denedim. Bir fark yaratmıyor gibi görünüyor. Sorun TCP'nin paketi webcokete iletmemesidir. Bunun olası nedenleri neler olabilir? İstemci tarafında websocket için TCP portunu kontrol ettim. Sunucu paketindeki hedef TCP bağlantı noktasıyla eşleşir.
s2o_ozman

@Saharsh İstemcinizde Javascript WebSockets API kullanıyor musunuz? Öyleyse, mesaj yükleme olay işleyicinizin aranmadığını mı söylüyorsunuz? Onerror olay işleyiciniz var mı? Aranıyor mu? Ayrıca, WebSockets sunucunuzun yaptığı bence başka bir hatayı vurgulamak için Cevabımı güncelledim.
Spiff

Gecikmeli cevap için özür dilerim. İşe aldım. Haklısın. Sorun SHA-1'deydi. Yardımınız için teşekkürler :)
s2o_ozman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.