有关UDP通信的一个问题

HenryGo 2005-04-19 05:17:01
现在我写了一个程序实现基于UDP的相互通信
但是存在着一个这样的问题:
要向服务器发送数据时,都要手动点击按钮让服务器处于接收数据状态

现在想改进一下,让服务器时刻都能接收来自客户端的消息
请问有什么方法?
...全文
115 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Practise_Think 2005-04-20
  • 打赏
  • 举报
回复
在程序一启动时就另开一线程用于等待接收数据即可!!
sodangerous 2005-04-20
  • 打赏
  • 举报
回复
/////////////////////server///////////////////////////////////////////////
#include <winsock2.h>
#include <stdio.h>
BOOL InitWinsock();
void main()
{
SOCKET socket1;

InitWinsock();
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen =sizeof(from);
local.sin_family=AF_INET;
local.sin_port=htons(1000); ///监听端口
local.sin_addr.s_addr=INADDR_ANY; ///本机

socket1=socket(AF_INET,SOCK_DGRAM,0);

bind(socket1,(struct sockaddr*)&local,sizeof local);

while (1)
{
char buffer[1024]="\0";
printf("waiting for message from others-------------\n");
if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)
{
printf("Received datagram from %s--%s\n",inet_ntoa(from.sin_addr),buffer);
////给cilent发信息
sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);

}
Sleep(500);
}

closesocket(socket1);


}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}
/////////////////////client///////////////////////////////////////////////
#include <winsock2.h>
#include <stdio.h>
BOOL InitWinsock();
void main()
{
SOCKET socket1;

InitWinsock();
struct sockaddr_in server;
int len =sizeof(server);
server.sin_family=AF_INET;
server.sin_port=htons(1000); ///server的监听端口
server.sin_addr.s_addr=inet_addr("168.168.0.10"); ///server的地址

socket1=socket(AF_INET,SOCK_DGRAM,0);
while (1)
{

char buffer[1024]="\0";
printf("input message\n");
scanf("%s",buffer);
if (strcmp(buffer,"bye")==0)
break;
if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)
{
if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,&len)!=SOCKET_ERROR)
printf("rece from server:%s\n",buffer);
}
}
closesocket(socket1);
}

BOOL InitWinsock()
{
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested=MAKEWORD(2,2);
Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
if(Error!=0)
{
return FALSE;
}
else
{
if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2)
{
WSACleanup();
return FALSE;
}

}
return TRUE;
}
oyljerry 2005-04-19
  • 打赏
  • 举报
回复
开线程处理,不要阻塞主线程
暗黑帝国 2005-04-19
  • 打赏
  • 举报
回复
开一个副线程,专门来接受就行了,或者用异步socket
xhzxlqt 2005-04-19
  • 打赏
  • 举报
回复
"但是如果服务器自动进入接收状态的话,整个程序都是没有响应的,直至成功接收到客户端的消息"
你一定是将死循环写在主线程中了.
另外开一个线程
ldiqing 2005-04-19
  • 打赏
  • 举报
回复
1、如果你采用API函数来编写
你需要做以下循环:
while(1){
……

}
2、如果你采用MFC的CSocket类来编写
按以下步骤:
首先新建一个派生自CSocket的类
Class CMySocket : public CSocket
{
……
}
然后
CMySocket listenSock;
listenSock.Create(m_port,SOCK_DGRAM);
接下来Microsoft把一切都做好了,当端口m_port上有数据到达时,会自动触发istenSock.OnReceive函数,所以你只需要在你的派生类CMySocket重写CSocket的成员函数OnReceive(),就是接收数据并处理。
HenryGo 2005-04-19
  • 打赏
  • 举报
回复
但是如果服务器自动进入接收状态的话,整个程序都是没有响应的,直至成功接收到客户端的消息
flyelf 2005-04-19
  • 打赏
  • 举报
回复
在启动服务器的时候就自动让服务器进入接收状态

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧