一直在自学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()"函数就可以了?
先谢谢大家了.
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()"函数就可以了?
先谢谢大家了.
2 当然可以的
1.我想楼主在recvfrom()的时候并未为其开一个线程
2.因为默认情况下recvfrom()是阻塞状态的,必须等到接收到数据后方可往下执行
3.上面的代码应该在一开始就进行连接初始化,SOCKET可以定义成全局变量,而后只要sendto()就OK了。
2、可以,多线程也可以共用一个Socket,甚至多进程都可以,不过你自己要设法避免冲突。