您的位置:首页 > 其它

UDP通信总结

2016-03-22 13:34 351 查看

1.必须先初始化网络编程接口

void UDPThread::InitWSA()
{
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;
}
}


(创建套接字)
m_Socket = socket(AF_INET, SOCK_DGRAM,0);
if (m_Socket == INVALID_SOCKET)
{
DWORD errCode = GetLastError();
int x=1;
}


2.设置接收端和发送端的ip和端口

(这里值得注意的是,接收端的ip最好设置为本机ip,我下面为自动获取本机ip

接收端和发送端的端口不能相同,不能使用系统已经占用的端口,具体是否占用可以使用netstat -ano查看)

SOCKADDR_IN m_addrRecv; //接收端地址设置

SOCKADDR_IN m_addrSend; //发送端地址设置

m_addrRecv.sin_addr.S_un.S_addr=inet_addr(DHAboutComFunction::DHGetHostInfo::GetHostIp().GetBuffer(0));        //set the host IP
m_addrRecv.sin_family=AF_INET;     //set the protocol family
m_addrRecv.sin_port=htons(iRecvPort);      //我们接收数据的端口,也是对方发送数据的端口

m_addrSend.sin_addr.S_un.S_addr=inet_addr(chSendIp); //设置对方接收端的ip
m_addrSend.sin_family=AF_INET;     //set the protocol family
m_addrSend.sin_port=htons(iSendport);      //设置对方绑定的端口


3.如果要接收数据,则必须绑定接收端地址

if (bind(m_Socket,(SOCKADDR*)&m_addrRecv,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
DWORD errCode = GetLastError();  //这儿显示失败代码
int x=1;
}


4.接收的时候可以设置为循环接收

char pBufArr[500] = {0};
int LenAddr = sizeof(SOCKADDR);
while(true)
{
int nRecvNum = recvfrom(m_Socket, pBufArr, 500, 0,(SOCKADDR*) &m_addrRecv, &LenAddr);
if (nRecvNum>0)
{
//获取到数据之后要做的事情
//如果对方是按位发送的,则可以使用指针移位,然后memcpy拷贝到相应的结构体中
struct STT
{
char ch[4];
int sz;
UCHAR uc;
};
STT stt;
memcpy(&stt , pBufArr, sizeof(STT));//取第一部分数据

char chbuf[20] ={0};
memcpy(chbuf , pBufArr + sizeof(STT), 20);//取第二部分数据...
}
}


5.如果要发送数据(memcpy)

void UDPThread::SendDateToFlat(char* chSend, size_t len )
{
//比如发送一个结构体
struct STT
{
char ch[4];
int sz;
UCHAR uc;
};
STT stt;
memcpy(stt.ch, "aaaa", 4);
stt.sz = 10;
stt.uc = 0x01;

int nSendNum = sendto(m_Socket, (char*)&stt, sizeof(stt), 0, (SOCKADDR*) &m_addrSend, sizeof(SOCKADDR));
//如果返回值<=0则发送失败
}


6.使用完之后需要关闭socket和WSA

closesocket(m_Socket);
WSACleanup();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: