Advertisement

c++ udp 接收与发送

阅读量:

SOCKET sed_socket = NULL;
SOCKET rec_socket = NULL;
sockaddr_in sed, rec;
void xxx::Client()
{
WSADATA wsd;
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
AfxMessageBox(_T("WSAStartup!"));
TRACE("Failed to load Winsock");
}
//发送区
rec_socket = socket(AF_INET, SOCK_DGRAM, 0);
memset(&sed, 0, sizeof(sed));
USES_CONVERSION;
char *chRemoteIP = W2A(RemoteIP3);
sed.sin_addr.S_un.S_addr = inet_addr(chRemoteIP);
sed.sin_family = AF_INET;
sed.sin_port = htons(_wtoi(RemoteHost3));
//接收区 绑定IP
sed_socket = socket(AF_INET, SOCK_DGRAM, 0);
if (sed_socket == INVALID_SOCKET)
{
TRACE("Failed to socket");
AfxMessageBox(_T("UDP_MES初始化失败socketServe!"));
WSACleanup();
}
memset(&rec, 0, sizeof(rec));
char *chLocalIP = W2A(LocalIP3);

rec.sin_family = AF_INET;
rec.sin_port = htons(_wtoi(LocalHost3));
rec.sin_addr.S_un.S_addr = inet_addr(chLocalIP);
int nRet = ::bind(sed_socket, (sockaddr*)&rec, sizeof(sockaddr));
if (nRet == SOCKET_ERROR)
{
closesocket(sed_socket);
WSACleanup();
AfxMessageBox(L"Bind Faild");
}
//开启两个线程
AfxBeginThread(SedTh, (LPVOID)2);
AfxBeginThread(RecTh, (LPVOID)2);
}
//两个while true线程
CString _szUdp;
UINT xxx::SedTh(LPVOID lParam){
int id = 999;
int send = false;
int overtime = 0;
CString csid = L"";
CString sendLog;
while (true){
Sleep(200);
if (!log.empty()){
//业务逻辑...
if (!send || csid == _szUdp){
csid.Format(L"%03d", id++ % 999);
sendLog = csid;
USES_CONVERSION;
char * pFileName = W2A(sendLog);
sendto(rec_socket, pFileName, strlen(pFileName), 0, (SOCKADDR*)&sed, sizeof(sed)); //一一对应
send = true;
}
}
if (send && csid != _szUdp){ //超时报警
overtime++;
if (overtime > 50){
alarm = 1;
USES_CONVERSION;
char * pFileName = W2A(sendLog);
sendto(rec_socket, pFileName, strlen(pFileName), 0, (SOCKADDR*)&sed, sizeof(sed));
overtime = 0;
}
if (alarm > 0.5 && overtime > 10){
alarm = 0;
}
}
}
closesocket(rec_socket);
return 0L;
}

UINT xxx::RecTh(LPVOID lParam)
{
int len = sizeof(rec);
while (true)
{
Sleep(20);
char recvBuf[1024] = { 0 };
int retval = recvfrom(sed_socket, recvBuf, 1024, 0, (SOCKADDR*)&rec, &len);
if (SOCKET_ERROR == retval)
break;

USES_CONVERSION;
定义了一个将接收缓冲区转换为A2T数据结构的过程。
}
调用socket发送端口关闭函数。
执行系统资源清理操作。
返回零长整型值。

在Windows环境下实现C/C++的异步UDP发送与非阻塞方式下的UDP接收,并提供自定义类封装的技术方案

参考文章:window下c/c++异步发送udp和非阻塞的方式接收udp的类封装_xsy29000的博客-博客_c++ udp 非阻塞

全部评论 (0)

还没有任何评论哟~