客户端到服务器连接只发送不接收

时间:2012-04-13 10:26:14

标签: client-server send socks

这是我的情况,我有一个服务器正在监听连接,还有一个我正在编程的客户端。客户端无需从服务器接收任何内容,但必须每3分钟发送一次状态更新。

我现在有以下内容:

    WSAStartup(0x101,&ws);
    sock = socket(AF_INET,SOCK_STREAM,0);
    sa.sin_family = AF_INET;
    sa.sin_port = htons(PORT_NET);
    sa.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    connect(sock,(SOCKADDR*)&sa,sizeof(sa));
    send(sock,(const char*)buffer,128,NULL);

我的方法应该如何?我可以避免循环recv吗?

1 个答案:

答案 0 :(得分:0)

这取决于您想要的行为和您的程序结构。 默认情况下,套接字将阻止任何读取或写入操作,这意味着如果您尝试让服务器的主线程轮询连接,您将最终将其“冻结”3分钟或直到客户端关闭连接。

绝对最简单的功能解决方案(无多线程)是将套接字设置为非阻塞,并在主线程中轮询。听起来你想避免这样做。

最明显的方法是为每个连接和主侦听器套接字创建一个专用线程。您的服务器侦听传入的连接,并为它创建的每个流套接字生成一个线程。然后每个连接线程阻塞它的套接字直到它接收数据,并自己处理它或将它分流到共享队列。 这是一个庞大而复杂的解决方案 - 需要打开和关闭的多个线程,需要保护的共享资源。

另一种选择是将套接字设置为非阻塞(在win32下使用setsockopt,因此设置一个超时,在* nix下传递O_NONBLOCK标志)。这样,如果没有可供读取的数据,它将返回控制。但是,这意味着您需要以合理的间隔轮询套接字(“合理”完全取决于您,以及您需要服务器对新数据执行操作的速度。)

就个人而言,对于你所描述的轻量级用法我会使用上面的组合:一个专用线程,它每隔几秒钟轮询一个套接字(或一组非阻塞套接字),在它们之间睡觉,然后简单地按下数据进入队列,主线程在主循环中作用于该队列。

有许多方法可以搞乱异步程序,因此最好保持简单并使其正常工作,直到您对控制流感到满意为止。

相关问题