Да дофига всего. Файрвол в винде режет любые такие внешние запросы, комп может быть включен через роутер, и для проброса с роутера на ПК надо его конфигурировать, наконец, у самого провайдера может быть NAT, и IP что вы видите на 2ip.ru принадлежит половине района... Вот поднимите VPN, заведите оба компа в него и внутри этой виртуальной сети может и достучитесь друг до друга
плюсы это компилируемый язык. после компиляции в коде не остаётся исходных названий из вашего кода, только логика, только сам код. если вам прям необходимо сохранить изначальные имена методов, добавляйте строки с их именем отдельно и печатайте когда нужно
Названия всё-таки могут присутствовать в бинарнике в некоторых случаях:
- отладочные символы
- экспортируемые функции библиотек
//где-то тут получаем пользовательский ввод строки hexString
//....
try
{
//парсим как 16-ричное число
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
}
catch (FormatException)
{
//не удалось распарсить, пишем ошибку
//...
}
На C/C++ можно написать системный драйвер или микропрограмму для железки.
В C/C++ есть union
В коде на C/C++ можно использовать ассемблерные вставки
Как уже писали, из-за близости языка к ассемблеру и машинному коду, упрощается работа с структурами данных и указателями, отсутствуют проверки и прослойки, само исполнение кода производится быстрее. Не требуется наличие .NET Framework, можно создать программу, не требующую вообще никаких дополнительных библиотек и ПО.
Почитайте про закон Де Моргана.
Вам нужно, чтоб odd_or_even была равна либо "odd", либо "even"
То есть: odd_or_even == "odd" || odd_or_even == "even"
Но ошибку нужно писать только, если это не выполняется: !(odd_or_even == "odd" || odd_or_even == "even")
Но это эквивалентно вот такому: odd_or_even != "odd" && odd_or_even != "even"
Если подумать, то условие odd_or_even != "odd" || odd_or_even != "even"
не выполнить невозможно, так как оно требует, чтобы odd_or_even одновременноне равнялось двум разным словам, что всегда выполняется
Я бы сделал у второй формы публичный метод для заполнения этих данных и вызвал бы его перед выводом формы на экран. Но учитывая, что у меня все всегда через одно место, не уверен, что этот метод тоже "правильный". Поясните, что имеете в виду под этим словом
Создаете Solution с двумя проектами, C# Windows Forms и C++ Win32 DLL.
Пишете свой код на C++, делаете dllexport функцию, принимающую, к примеру, void*, куда будут складываться данные.
В C# классе используете Dllimport, через Marshal.AllocHGlobal аллоцируете память, передаете в вызов C++ функции, она что-то там заполняет, потом достаете через Marshal.Copy и работаете с этим дальше
На коротких сообщениях (меньше MTU) такого не будет. Вот если будете в одном из потоков слать несколько килобайт, может возникнуть ситуация, когда части сообщений перемешаются.
Пример:
- поток 1 посылает 10000 байт, send вернул 2048
- поток 2 в это время записывает короткую команду в этот же сокет
- поток 1 досылает оставшиеся байты, но перед ними уже влезла команда из потока 2
Почему бы не добавить мьютексы? Или несколько сокетов?