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;
_szUdp = A2T(recvBuf);
}
closesocket(sed_socket);
WSACleanup();
return 0L;
}
一个简单的示例,引用:window下c/c++异步发送udp和非阻塞的方式接收udp的类封装_xsy29000的博客-CSDN博客_c++ udp 非阻塞