Как отправлять и получать сообщения из сокета в Haskell - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь создать сервер TCP в Haskell и до сих пор не могу открыть соединение с расширением браузера Google и оставить его открытым:

Error

Server.exe: Network.Socket.sendBuf: failed (Unknown error)

код

import Network.Socket
import qualified Network.Socket.ByteString as B
import Data.ByteString.Char8(pack,unpack)

main::IO()
main=do
    sock<-socket AF_INET Stream 0
    bind sock (SockAddrInet 8500 iNADDR_ANY)
    listen sock 3
    (csock,_)<-accept sock
    loop csock

loop::Socket->IO()
loop csock=do
    print "Begining of loop"
   -- dat<-B.recv csock 2000
    sent<-B.send  csock $ pack "Hi!!"
  --  print $ unwords  ["Received :",unpack dat]
    print "End of loop"
    loop csock

Сначала я попробовал только с отправкой сообщений, и я получаю сообщение об ошибке, если я раскомментирую строки с recv, он зависает

Вывод с закомментированными строками

"Begining of loop"
"End of loop"
"Begining of loop"
"End of loop"
"Begining of loop"
"End of loop"
"Begining of loop"
Server.exe: Network.Socket.sendBuf: failed (Unknown error)

Вывод с некомментированными строками

"Begining of loop"
"Received : GET / HTTP/1.1\r\nHost: localhost:8500\r\nConnection: Upgrade\r\nPragma: no-cache\r\nCache-Control: no-cache\r\nUpgrade: websocket\r\nOrigin: chrome-extension://pfdhoblngboilpfeibdedpjgfnlcodoo\r\nSec-WebSocket-Version: 13\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/73.0.3683.103 Safari/537.36\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: en,en-US;q=0.9,ro;q=0.8\r\nSec-WebSocket-Key: WY87jPXNRfk/WM5T20O8Jg==\r\nSec-WebSocket-Extensions: permessage-deflate; client_max_window_bits\r\n\r\n"
"End of loop"
"Begining of loop"

P.S Я использую расширение Simple WebSocket Client в Chrome, и в обоих случаях соединение отображается как «Открывающееся», а не «Открытое», даже несмотря на то, что программа выполняет несколько итераций, как вы можете видеть в выходных данных

1 Ответ

0 голосов
/ 17 апреля 2019

Сервер работал нормально. Проблема заключалась в том, что я пытался подключиться, используя расширение Chrome Simple WebSocket Client, которое, как следует из названия, пытается открыть соединение WebSocket, в то время как мой сервер обрабатывает простые Socket соединения.

Я попытался подключиться к серверу, используя telnet, и он работал нормально (как отправка, так и получение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...