Статьи

Windows Phone 7 Sockets: отладка

Это часть IV учебного пособия, в котором будет описана поддержка сокетов в WP7 с точки зрения разработчика. Эта серия учебников будет посвящена разработке приложений WP7, для которых требуется длительное TCP-соединение, которое отправляет и получает текстовые данные. В этих постах мы рассмотрим создание полноценного IRC-клиента.

Основное внимание в этих постах уделяется разработчикам WP7. Если вы хотите лучше понять внутренние детали интернет-сокетов, в Википедии есть хорошее введение по этому вопросу.

Эта часть серии будет посвящена отладке сокетов. В следующей части мы собираемся завершить эту серию уроков, добавив сокет-соединения SSL в наше приложение.

Фон

Основа нашего клиента готова . Он может открыть соединение , получить сообщение и отправить сообщение . Но это не очень богатый функционал. Когда вы начинаете добавлять функции, вполне вероятно, что в какой-то момент вам придется отлаживать входящие или исходящие сообщения.

Основной способ: Debug.WriteLine

Самый основной способ отладки сокетов — использовать Debug.WriteLine для регистрации каждого входящего и исходящего сообщения, прежде чем какая-либо обработка сообщения будет выполнена. При добавлении такого рода механизма отладки у нас есть отправная точка для понимания того, что происходит между клиентом и сервером.

Debug.WriteLine будет регистрировать сообщения в окне вывода Visual Studio:

образ

Но это окно не показывает все. Давайте изменим нашу отладку так, чтобы она также обрезала полученное сообщение и выводила количество символов:

Debug.WriteLine("Char count: {0} - Message: {1}", ircMessage.Length, ircMessage.Trim());

Теперь сравните эти две строки, которые мы можем получить от сервера:

образ

Сообщения выглядят одинаково, но количество символов говорит о другом. Причина этого заключается в том, что первое сообщение содержит специальный символ, который не может отображаться в окне вывода Visual Studio. Ситуация меняется, когда строки копируются в Блокнот ++:

образ

Несмотря на то, что Notepad ++ не может правильно отобразить сообщение, мы можем увидеть разницу: перед «0» есть специальный символ. Если вам интересно, откуда этот символ, это сообщение с цветовой кодировкой, отправленное с использованием mIRC .

Debug.WriteLine позволяет быстро начать работу, но помните: ваше окно вывода может скрывать что-то от вас.

Wireshark

В случае, если Debug.WriteLine слишком ограничен для вашего сценария, вероятно, WireShark нет. WireShark позволяет «углубиться»:

Wireshark — это бесплатный анализатор пакетов с открытым исходным кодом. Он используется для устранения неполадок в сети, анализа, разработки программного обеспечения и протоколов связи, а также для обучения.

With WireShark we can capture every packet which is sent between our app and the server. When you download, install and run it, you’re first greeted with a dashboard, which lists all your network adapters:

образ

This computer has only one real network interface called “Atheros L1C PCI-E Ethernet Controller”. The situation differs between various computers but usually there should be only one, maybe two interfaces. When you select the correct one, WireShark automatically starts following the packages and showing this info to you, in real time.

образ

WireShark is an excellent tool, but in our case it has one problem: It shows too much data. There’s just too many packets moving around and without filtering it it’s just not possible to find the related bits and pieces. But fortunately WireShark contains good tools for getting rid of the irrelevant data.

We want to monitor only the packages which are sent between our IRC-client and the server. So, let’s start by selecting Capture – Stop from the menu:

образ

Then, let’s add a filter which removes everything except the packages which are from or to our IRC-server. In this case our server’s IP-address is 195.197.52.90. Here’s a filter which removes everything else:

ip.src eq 195.197.52.90 or ip.dst eq 195.197.52.90

This filter can be added to the top-left part of WireShark:

образ

Now, start capturing the data by selecting Capture – Start. WireShark offers you the option to save the last capture as a file but we can continue without saving. Then, run your app and try to connect to the server. WireShark shows the packages moving between the client and the server and this time there isn’t that much data.

образ

Try double clicking one of the lines with protocol “IRC” and you’ll see the exact message:

образ

The listing is now quite good but still, we can make it even better. As you notice, there’s few items in the list with protocol TCP and if you look at the details of these messages, you’ll notice that they don’t contain any meaningful data for us. We can filter those out too:

(ip.src eq 195.197.52.90 or ip.dst eq 195.197.52.90) and irc

Now we have a filter which shows only the messages between our client and the server and in addition to that, it shows only the messages related to the IRC-protocol.

Conclusion

In this post we went through of couple different ways of debugging socket connections. Debug.WriteLine gets you started rapidly but remember, some character may not be visible. WireShark is the other option. It’s much more harder to use but also much more advanced.

Next up: Using SSL with Windows Phone sockets.

Source code

The whole source code for this tutorial is available from the GitHub.

Links

Source: http://mikaelkoskinen.net/post/wp7-sockets-tutorial-debugging.aspx