C++编程

tanaili0503 2010-12-24 07:10:49
如何编写UDP客户端与服务器端的程序?
...全文
183 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lghndyz 2010-12-25
  • 打赏
  • 举报
回复
纯c++的,直接用sock写!!
客户端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
sendto(sockClient,"Hello",strlen("Hello")+1,0,
(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}

服务端
#include <Winsock2.h>
#include <stdio.h>

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
我不懂电脑 2010-12-24
  • 打赏
  • 举报
回复
楼上的很详细
xjq2003 2010-12-24
  • 打赏
  • 举报
回复
C++ Builder下三种UDP通信实现方法的比较(1)

主要讨论一下数据的接受:
1.NMUDP控件
这个控件使用起来比较简单,设定监听端口,然后响应DataReceived事件就可以了,例如:
void __fastcall TMoniter::NMUDPDataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
/* 用一个标志变量控制控件受信后是否执行需要的操作 */
if (recvFlag)
{
int rl;
/* 用于接受数据的内存 */
unsigned char rbuf[1024 * 9];

/* 控件的ReadBuffer方法,把接受到的数据存储到rbuf */
NMUDP -> ReadBuffer(rbuf , sizeof(rbuf) , rl);

/* 字符串结束 */
rbuf[rl]=0;

/* stream是事先定义的文件指针 */
if (stream != NULL)
{
/* 自编doLog函数,把接收数据写入日志文件 */
doLog( false , rbuf ,rl );
}
}
}
这个控件的优点是使用简单、效率比较高,但是只支持2K的缓冲,所以上面开辟的9K内存是多余的。2K的限制使我在项目中不得不放弃了这个控件。

2.IdUDPServer控件
使用方法跟NMUDP差不多,响应UDPRead事件就可以了,例如:(注释参考1)
void __fastcall TMoniter::IdUDPServer1UDPRead(TObject *Sender,
TStream *AData, TIdSocketHandle *ABinding)
{
if (recvFlag)
{
int r1;



1.C++ Builder下三种UDP通信实现方法的比较(1)
2.C++ Builder下三种UDP通信实现方法的比较(2)
3.C++ Builder下三种UDP通信实现方法的比较(3)
4.C++ Builder下三种UDP通信实现方法的比较(4)
5.C++ Builder下三种UDP通信实现方法的比较(5)
6.C++ Builder下三种UDP通信实现方法的比较(6)
http://www.xgdown.com/article/175/51110_1.htm

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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