wip: feat: implement sending via multicast

This commit is contained in:
45Tatami 2023-05-24 00:08:13 +02:00
parent bd438dc77c
commit 1abc3f43f2
3 changed files with 60 additions and 4 deletions

View File

@ -46,9 +46,11 @@ HWND win_hndl = NULL;
UINT const WM_USR_LOG = WM_APP + 1;
UINT const WM_USR_TOGGLE_CONNECT = WM_APP + 2;
UINT const WM_USR_LOAD_CONFIG = WM_APP + 3;
UINT const WM_USR_TOGGLE_MULTICAST = WM_APP + 4;
HANDLE comm_thread;
wstring remote = L"localhost:30501";
wstring remote_multicast = L"239.80.123.4:30501";
wstring config_file_path;
// Mutex/cv protects following vars
@ -122,6 +124,10 @@ void toggle_want_connect()
PostMessage(win_hndl, WM_USR_TOGGLE_CONNECT, (WPARAM) NULL, (LPARAM) NULL);
}
void toggle_multicast() {
PostMessage(win_hndl, WM_USR_TOGGLE_MULTICAST, (WPARAM) NULL, (LPARAM) NULL);
}
void save_config(path const& filepath, wstring const& remote, bool connect)
{
std::wofstream f{filepath, std::ios_base::trunc};
@ -242,6 +248,12 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
break;
}
case IDC_MULTI_BOX:
{
bool const checked = IsDlgButtonChecked(hWnd, IDC_MULTI_BOX);
toggle_multicast();
break;
}
default:
return false;
}
@ -288,6 +300,23 @@ INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPara
conn_cv.notify_one();
return true;
}
case WM_USR_TOGGLE_MULTICAST:
{
lock_guard<mutex> conn_lk{ conn_mut };
want_connect = false;
// TODO wait for disconnect?
// off -> on
// button set text "set"
// text set saved multicast
//
// on -> off
// button set text "Connect"
// text set saved unicast
return true;
}
case WM_USR_LOAD_CONFIG:
{
lock_guard<mutex> conn_lk{ conn_mut };
@ -422,6 +451,31 @@ SOCKET _connect() {
return sock;
}
SOCKET _connect_multic()
{
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
// TODO fd < 0
string remote_ch =
wstring_convert<codecvt_utf8_utf16<wchar_t>>{}.to_bytes(remote_multicast);
auto pos = remote_ch.rfind(":");
string port_str = pos == string::npos ? "30501" : remote_ch.substr(pos + 1);
u_short port = std::stoul(port_str);
struct sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(remote_ch.c_str());
addr.sin_port = htons(port);
connect(sock, (struct sockaddr *) &addr, sizeof(addr));
// TODO return
return sock;
}
bool _send(SOCKET &sock, string const &msg) {
int len = (int) msg.length();
int buf_len = len + 4;

View File

@ -1257,6 +1257,7 @@
#define IDC_BTN_SUBMIT2 1002
#define IDC_EDIT2 1003
#define IDC_LOG 1003
#define IDC_MULTI_BOX 1004
#define CF_GDIOBJLAST 0x03FF
#define _WIN32_WINNT_NT4 0x0400
#define _WIN32_IE_IE40 0x0400
@ -1618,7 +1619,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 105
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1004
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -48,14 +48,15 @@ END
// Dialog
//
IDD_DIALOG1 DIALOGEX 0, 0, 309, 177
IDD_DIALOG1 DIALOGEX 0, 0, 309, 187
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION
CAPTION "TCP Sender"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
EDITTEXT IDC_REMOTE,7,7,228,14,ES_AUTOHSCROLL
EDITTEXT IDC_REMOTE,7,13,228,14,ES_AUTOHSCROLL
PUSHBUTTON "Connect",IDC_BTN_SUBMIT,252,7,50,14,BS_CENTER
EDITTEXT IDC_LOG,7,31,295,139,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY
AUTOCHECKBOX "Multicast",IDC_MULTI_BOX,255,24,228,14
EDITTEXT IDC_LOG,7,41,295,139,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY
END