/*
make include & libs
LIBS = -LC:/c/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -lws2_32
INCLUDE = -IC:\c\mingw\include -IC:/c/gtk/include/gtk-2.0 -IC:/c/gtk/lib/gtk-2.0/include -IC:/c/gtk/include/atk-1.0 -IC:/c/gtk/include/cairo -IC:/c/gtk/include/pango-1.0 -IC:/c/gtk/include/glib-2.0 -IC:/c/gtk/lib/glib-2.0/include -IC:/c/gtk/include/libpng12
*/
#include <gtk/gtk.h>
#include <winsock2.h>
gint close_window(GtkWidget *widget, GdkEvent *event, gpointer data) {
// Shut Winsock back down and take off.
WSACleanup();
gtk_main_quit();
return FALSE;
}
gboolean inmessage(GIOChannel *source, GIOCondition condition, gpointer data) {
sockaddr_in ClientAddr;
int ClientAddrSize = (int) sizeof(ClientAddr);
// делаем ацепт
SOCKET ClientSocket = accept(g_io_channel_unix_get_fd(source),
(sockaddr*) &ClientAddr, &ClientAddrSize);
// создаем канал для нового сокета
GIOChannel *ClientChannel = g_io_channel_win32_new_socket(ClientSocket);
if(!ClientChannel) {
g_print("Failed to create listener channel.\n");
return FALSE;
}
gchar buf[256];
gsize bread = 0;
GError *err = 0;
// читаем статус 3 = G_IO_STATUS_AGAIN, прочитано 0
// если загнать в цикл по статусу, то цикл бесконечный :(
int status = -1;
status = g_io_channel_read_chars (ClientChannel, buf, 256, &bread, &err);
g_print("status %i\n read %i\n", status, bread);
// закрываем канал
g_io_channel_shutdown (ClientChannel, TRUE, &err);
// вариант без каналов... тоже не работает...
/* char acReadBuffer[256];
int nReadBytes;
do {
g_print("reading...");
nReadBytes = recv(ClientSocket, acReadBuffer, 256, 0);
if (nReadBytes > 0) {
g_print("Received %i\n", nReadBytes);
}
else if (nReadBytes == SOCKET_ERROR) {
g_print("error");
break;
}
} while (nReadBytes != 0);
shutdown(ClientSocket, SD_SEND);
closesocket(ClientSocket); */
return TRUE;
}
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// включаем дебажные сообщения
g_setenv("G_IO_WIN32_DEBUG", "1", TRUE);
// создаем сокет
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
g_print("can not start socket api");
return 255;
}
SOCKET sck = socket(AF_INET, SOCK_STREAM, 0);
// слушаем любой ip на 40001 порту
sockaddr_in sck_addr;
sck_addr.sin_family = AF_INET;
sck_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//sck_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
sck_addr.sin_port = htons(40001);
if (bind(sck, (sockaddr*) &sck_addr, sizeof(sockaddr_in)) != 0) {
g_print("can not bind socket 40001");
return 255;
}
if (listen(sck, 10) < 0) {
g_print("Unable to listen on socket 40001\n");
return 255;
}
// создаем glib channel
GIOChannel* socketChannel = g_io_channel_win32_new_socket(sck);
if(!socketChannel) {
g_print("can not create listener channel.\n");
return 255;
}
//g_io_channel_set_encoding(socketChannel, NULL, NULL);
//g_io_channel_set_buffered(socketChannel, FALSE);
GtkWidget *window;
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "capture server");
g_signal_connect(G_OBJECT(window), "close_window", G_CALLBACK(close_window), NULL);
gtk_window_set_default_size(GTK_WINDOW(window), 100, 100);
// зацепляем в основную очередь гтк колбэк
g_io_add_watch(socketChannel, G_IO_IN, inmessage, NULL);
gtk_widget_show(window);
gtk_main();
return 0;
}