user4744: I want to get started with the Mt. Gox websockets API, but I can't seem to get a good response from the server.
I'm sending the following (captured with Wireshark):
GET /mtgox HTTP/1.1
User-Agent: websocket-sharp/1.0
Upgrade: websocket
Connection: Upgrade
Host: websocket.mtgox.com
Sec-WebSocket-Key: LtH+YFgnW1N8KDLDbocsUQ==
Sec-WebSocket-Version: 13

and the server responds:
HTTP/1.1 400 Bad Request

I've tried sending the handshake via telnet and with this C# code and I still get a 400 Bad Request error:
class Program
{
    static void Main(string[] args)
    {
        ClientWebSocket ws = new ClientWebSocket();
        Task connectionTask = ws.ConnectAsync(new Uri("ws://websocket.mtgox.com/mtgox"), CancellationToken.None);
        Console.Write("Connecting");
        while (!connectionTask.IsCompleted)
        {
            Console.Write(".");
            Thread.Sleep(100);
        }
        Console.WriteLine(ws.State);
    }
}

(The last line printed is "Closed" and when I inspect the handshake with Wireshark I see the same 400 Bad Request)
Any ideas what I'm doing wrong? I can't see much documentation or samples using the websockets API so I don't really have anything to compare to :(
In response to sta's suggestion, I tried this (using WebsocketSharp):
static void Main(string[] args)
{
    WebSocket ws = new WebSocket("ws://websocket.mtgox.com/mtgox");
    ws.Origin = "http://websocket.mtgox.com";
    ws.Connect();
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    Console.WriteLine("{0}", ws.IsAlive);
    Console.ReadLine();
}

This displays FALSE so there's still something I'm doing wrong :/ I haven't had a chance to dig into WebSocketSharp yet though
Update:
With WebsocketSharp setting the Origin header correctly, Wireshark shows the mtgox server accepting the websocket upgrade:
HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: 2+1ghzJ/Itt6w1aBdUteghcsJHk=\r\n
\r\n

But WebSocketSharp still reports the connection as closed :(

user4876: It seems that the client should send the Origin header in opening handshake to the MtGox server.
If you use current websocket-sharp, you should do like the following before connecting.

ws.Origin = "http://websocket.mtgox.com";

Could you try?
Update:
Could you try again the following code?
static void Main(string[] args)
{
    var ws = new WebSocket("ws://websocket.mtgox.com/mtgox?Currency=USD");
    ws.Origin = "http://websocket.mtgox.com";
    ws.OnOpen += (sender, e) =>
    {
      ws.Send(
@"{
    ""op"": ""unsubscribe"",
    ""channel"": ""d5f06780-30a8-4a48-a2f8-7ed181b4a13f""
}"
      );
    };
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    ws.Connect();
    Console.ReadLine();
    ws.Close();
}

It seems that an exception has occurred when the client is receiving ticker type data in a while.
I'll investigate a little further.
Update:
I've found out the cause of the exception, and fixed websocket-sharp.
Could you try your code with current websocket-sharp?

4744: <p>I want to get started with the Mt. Gox websockets API, but I can't seem to get a good response from the server.</p>

<p>I'm sending the following (captured with Wireshark):</p>

<pre><code>GET /mtgox HTTP/1.1
User-Agent: websocket-sharp/1.0
Upgrade: websocket
Connection: Upgrade
Host: websocket.mtgox.com
Sec-WebSocket-Key: LtH+YFgnW1N8KDLDbocsUQ==
Sec-WebSocket-Version: 13
</code></pre>

<p>and the server responds:</p>

<pre><code>HTTP/1.1 400 Bad Request
</code></pre>

<p>I've tried sending the handshake via telnet and with this C# code and I still get a 400 Bad Request error:</p>

<pre><code>class Program
{
    static void Main(string[] args)
    {
        ClientWebSocket ws = new ClientWebSocket();
        Task connectionTask = ws.ConnectAsync(new Uri("ws://websocket.mtgox.com/mtgox"), CancellationToken.None);
        Console.Write("Connecting");
        while (!connectionTask.IsCompleted)
        {
            Console.Write(".");
            Thread.Sleep(100);
        }
        Console.WriteLine(ws.State);
    }
}
</code></pre>

<p>(The last line printed is "Closed" and when I inspect the handshake with Wireshark I see the same 400 Bad Request)</p>

<p>Any ideas what I'm doing wrong? I can't see much documentation or samples using the websockets API so I don't really have anything to compare to :(</p>

<p>In response to sta's suggestion, I tried this (using WebsocketSharp):</p>

<pre><code>static void Main(string[] args)
{
    WebSocket ws = new WebSocket("ws://websocket.mtgox.com/mtgox");
    ws.Origin = "http://websocket.mtgox.com";
    ws.Connect();
    ws.OnMessage += (sender, e) =&gt;
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    Console.WriteLine("{0}", ws.IsAlive);
    Console.ReadLine();
}
</code></pre>

<p>This displays <code>FALSE</code> so there's still something I'm doing wrong :/ I haven't had a chance to dig into WebSocketSharp yet though</p>

<p>Update:
With WebsocketSharp setting the Origin header correctly, Wireshark shows the mtgox server accepting the websocket upgrade:</p>

<pre><code>HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: 2+1ghzJ/Itt6w1aBdUteghcsJHk=\r\n
\r\n
</code></pre>

<p>But WebSocketSharp still reports the connection as closed :(</p>
 4876: <p>It seems that the client should send the Origin header in opening handshake to the MtGox server.</p>

<p>If you use current websocket-sharp, you should do like the following before connecting.</p>

<p><code>
ws.Origin = "<a href="http://websocket.mtgox.com" rel="nofollow">http://websocket.mtgox.com</a>";
</code></p>

<p>Could you try?</p>

<p>Update:</p>

<p>Could you try again the following code?</p>

<pre><code>static void Main(string[] args)
{
    var ws = new WebSocket("ws://websocket.mtgox.com/mtgox?Currency=USD");
    ws.Origin = "http://websocket.mtgox.com";
    ws.OnOpen += (sender, e) =&gt;
    {
      ws.Send(
@"{
    ""op"": ""unsubscribe"",
    ""channel"": ""d5f06780-30a8-4a48-a2f8-7ed181b4a13f""
}"
      );
    };
    ws.OnMessage += (sender, e) =&gt;
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    ws.Connect();
    Console.ReadLine();
    ws.Close();
}
</code></pre>

<p>It seems that an exception has occurred when the client is receiving ticker type data in a while.</p>

<p>I'll investigate a little further.</p>

<p>Update:</p>

<p>I've found out the cause of the exception, and fixed websocket-sharp.</p>

<p>Could you try your code with current websocket-sharp?</p>
