一直在自学WINSOCK编程,遇到一个问题,困扰了很长时间,希望大家能给个解决方法.问题1:在服务端绑定某个端口之后,就调用recvfrom()函数从连接过来的客户端读取数据流.但是在绑定端口之后,接收数据之前服务端一直处于等待状态,我这用MFC写的,程序就一直卡在那,甚至不能拖动,直到有客户端连接过来才可以继续运行下面的程序.请问这个问题怎么解决?用多线程吗?问题2:我在用MFC进行WINSOCK编程的时候,比如在客户端向服务端发送一个请求,需要按下一个按钮,发送另一个请求时,需要按下另一个按钮.这两个按钮对应的函数里都是完整的一个SOCK处理过程:WSADATA wsaData;
    SOCKET  socketS;
    SOCKADDR_IN serverAddr;
    char sendbuf[1024] = "MSG1";

    WSAStartup(MAKEWORD(1,1), &wsaData);

    socketS = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(5679);
    serverAddr.sin_addr.s_addr = inet_addr("192.168.0.100");    sendto(socketS, sendbuf, sizeof(sendbuf), 0, (SOCKADDR*)&serverAddr, sizeof(serverAddr));    closesocket(socketS);
    WSACleanup();
每次按下一个按钮都要进行这样的完整的SOCK过程,很浪费时间和内存,能不能把其中的一些过程设置成全局的,只在按钮对应的代码中处理"sendto()"函数就可以了?
先谢谢大家了.

解决方案 »

  1.   

    问题1:在服务端绑定某个端口之后,就调用recvfrom()函数从连接过来的客户端读取数据流.但是在绑定端口之后,接收数据之前服务端一直处于等待状态,我这用MFC写的,程序就一直卡在那,甚至不能拖动,直到有客户端连接过来才可以继续运行下面的程序.请问这个问题怎么解决?用多线程吗? 是必须用一个单独的线程去处理数据的,recvfrom阻塞或者采用select模型获取数据.不能和界面线程用在一起,否则就卡:)问题2: 每次按下一个按钮都要进行这样的完整的SOCK过程,很浪费时间和内存,能不能把其中的一些过程设置成全局的,只在按钮对应的代码中处理"sendto()"函数就可以了? 都是这么做的~:),在发送完之前创建自己的socket和sockaddr(地址)就好了,然后就是一直的调用
      

  2.   

    1可以使用异步IO ,多线程,select进行检测。
    2 当然可以的
      

  3.   

    听楼主的描述,大致知道了问题出在哪
    1.我想楼主在recvfrom()的时候并未为其开一个线程
    2.因为默认情况下recvfrom()是阻塞状态的,必须等到接收到数据后方可往下执行
    3.上面的代码应该在一开始就进行连接初始化,SOCKET可以定义成全局变量,而后只要sendto()就OK了。
      

  4.   

    1、Socket默认是阻塞模式,所以你执行recvfrom时会一直等待。你可以用单独一个线程处理,也可以设置非阻塞模式。
    2、可以,多线程也可以共用一个Socket,甚至多进程都可以,不过你自己要设法避免冲突。