не получает создать сервер под GTK.. сокет цепляется, но потом не читается...

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
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;
}