g_io_channel + socket = server,还只得到一个客户端? 用C语言

伙计们,这里ma代码:

#include  #include  // gio channel #include  //socket(); #include  // structure #include  // printf void deal(GIOChannel *in, GIOCondition condition, gpointer data) { struct sockaddr_storage income; int insock = g_io_channel_unix_get_fd(in); socklen_t income_len = sizeof(income); int newsock = accept(insock, (struct sockaddr*)&income, &income_len ); if(newsock == -1) { printf("failure on newsock\n"); } char buff[128]; int recv_total = 0; int recv_byte = 128; int recv_sizing; while (recv_total < recv_byte ){ recv_sizing = recv(newsock,buff + recv_total,recv_byte,0); // breaking if recv_sizing = -1 assuming as error, 0 assuming as lost communication from client suddenly if(recv_sizing < 0 || recv_sizing == 0) { printf("connection lost or error while recv(); [ just guess ] number : %d \n",recv_sizing); break; } recv_byte -= recv_sizing; recv_total += recv_sizing; } buff[recv_total] = '\0'; //recv_sizing = recv(newsock,buff,recv_byte,0); printf("data : %s\n",buff); close(newsock); // close immediate and look for another some1 new } int main() { GIOChannel *in; struct sockaddr_in my; my.sin_addr.s_addr = INADDR_ANY; my.sin_family = AF_INET; my.sin_port = htons(3000); //socket initiate root socket int rsock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //allow re-use address setsockopt(rsock,SOL_SOCKET,SO_REUSEADDR,(int*)1,sizeof(int)); //binding bind(rsock,(struct sockaddr*)&my,sizeof(my)); //listen listen(rsock,10); in = g_io_channel_unix_new(rsock); g_io_add_watch(in, G_IO_IN | G_IO_OUT | G_IO_HUP, (GIOFunc) deal, NULL); GMainLoop *loop = g_main_loop_new(NULL,FALSE); // pengganti while(1) ato gtk_main_loop g_main_loop_run(loop); return 0; } 

这些是如何编译和运行:

 $ gcc -o dengersocket_glib dengersocket_glib.c `pkg-config --cflags --libs glib-2.0` $ ./dengersocket_glib 

客户想尝试发送:

 $ echo wew | nc -v localhost 3000 nc: connect to localhost port 3000 (tcp) failed: Connection refused Connection to localhost 3000 port [tcp/*] succeeded! 

服务器接收:

 $ ./dengersocket_glib connection lost or error while recv(); [ just guess ] number : 0 data : wew 

收到确定,但当另一个客户端尝试连接时:

 $ echo dor | nc -v localhost 3000 nc: connect to localhost port 3000 (tcp) failed: Connection refused Connection to localhost 3000 port [tcp/*] succeeded! 

服务器上什么都没发生,如何使服务器可以接受多个客户端? 在这些情况下真的需要fd_set吗?

GIOFunc类型返回gboolean,而不是void。 你通过在将函数注册为回调时将函数转换为GIOFunc来解决这个问题。

由于您的函数没有返回任何内容,因此调用它的glib代码可能会将“FALSE”视为函数的返回值。 glib中的FALSE表示“我不再需要监视此事件源”,因此当主循环仍在运行时(您从不调用g_main_loop_quit()),它不再监视您的套接字。

正确实施GIOFunc,您的问题可能会消失。