-
GLib와 GIO를 이용한 간단한 네트워크 서버와 클라이언트 예제Programmer/Computer Skills 2013. 8. 13. 16:25
예전에 인터넷에서 우연히 발견한 GLib와 GIO를 이용한 간단한 네트워크 서버/클라이언트 예제이다. GLib의 이벤트 루프와 GIO의 네트워크 기능을 활용하여 서버를 개발하는 좋은 샘플이 될 것으로 기대한다.
서버 소스
#include <glib.h>
#include <gio/gio.h>
static
GInetAddress*
get_localhost()
{
/* No clean way to handle IPV6, short of guess/check */
GInetAddress* addr = g_inet_address_new_any(G_SOCKET_FAMILY_IPV4);
if
(!addr) {
addr = g_inet_address_new_any(G_SOCKET_FAMILY_IPV6);
}
return
addr;
}
/* this function will get called everytime a client attempts to connect */
gboolean
incoming_callback(GSocketService *service,
GSocketConnection *connection,
GObject *source_object,
gpointer user_data)
{
g_print(
"Received connection from client!\n"
);
GInputStream *istream = g_io_stream_get_input_stream(G_IO_STREAM(connection));
gchar message[1024];
g_input_stream_read(istream,
message,
1024,
NULL,
NULL);
g_print(
"Message was: \"%s\"\n"
, message);
return
FALSE;
}
int
main(
int
argc,
char
**argv)
{
/* initialize glib */
g_type_init();
/* initialize the thread system */
if
(!g_thread_supported())
g_thread_init(NULL);
GError *error = NULL;
/* create a new socketservice */
GSocketService *service = g_threaded_socket_service_new(10);
/* create a new address */
GInetAddress *inet_addr = get_localhost();
GSocketAddress *sock_addr = g_inet_socket_address_new(inet_addr,
1500);
/* your port goes here */
/* connect to the address */
GSocketAddress* effective_addr;
g_socket_listener_add_address(G_SOCKET_LISTENER(service),
sock_addr,
G_SOCKET_TYPE_STREAM,
G_SOCKET_PROTOCOL_TCP,
NULL,
&effective_addr,
&error);
/* don't forget to check for errors */
if
(error != NULL) {
g_error(error->message);
}
/* listen to the 'incoming' signal */
g_signal_connect(service,
"incoming"
,
G_CALLBACK(incoming_callback),
NULL);
/* start the socket service */
g_socket_service_start(service);
/* enter mainloop */
g_print(
"Waiting for client!\n"
);
GMainLoop *loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
g_main_loop_unref(loop);
return
0;
}
클라이언트 소스
#include <glib.h>
#include <gio/gio.h>
int
main(
int
argc,
char
**argv)
{
/* initialize glib */
g_type_init();
GError *error = NULL;
/* create a new connection */
GSocketConnection *connection = NULL;
GSocketClient *client = g_socket_client_new();
/* connect to the host */
connection = g_socket_client_connect_to_host(client,
(gchar *)
"localhost"
,
1500,
/* your port goes here */
NULL,
&error);
/* don't forget to check for errors */
if
(error != NULL) {
g_error(error->message);
}
else
{
g_print(
"Connection successful!\n"
);
}
/* use the connection */
GInputStream *istream = g_io_stream_get_input_stream(G_IO_STREAM(connection));
GOutputStream *ostream = g_io_stream_get_output_stream(G_IO_STREAM(connection));
g_output_stream_write(ostream,
"Hello server!"
,
/* your message goes here */
13,
/* length of your message */
NULL,
&error);
/* don't forget to check for errors */
if
(error != NULL) {
g_error(error->message);
}
return
0;
}
'Programmer > Computer Skills' 카테고리의 다른 글
쉘스크립트에서 안전하게 문자열(string)을 비교하는 방법 (0) 2016.09.30 CentOS 6에서 eclipse가 죽는 문제 해결하기 (0) 2015.02.27 diff 출력 형식 (0) 2013.05.31 UltraVNC로 접속한 원격 데스크탑에서 Alt+TAB 사용하기 (0) 2013.03.04 Nautilus에서 파일이나 디렉토리 숨기기 (0) 2013.03.04