1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
AnsiString UdpGet(int listenPort,AnsiString& rxData, AnsiString& ipAddr, int& port)
// recvfrom failed with error 10035
{
AnsiString mes ;
int iResult ;
// Initialize Winsock
WSADATA wsaData;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
mes.sprintf("WSAStartup function failed with error: %d",iResult) ;
return mes ;
}
// Create a receiver socket to receive datagrams
SOCKET RecvSocket ;
RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (RecvSocket == INVALID_SOCKET)
{
mes.sprintf("socket function failed with error: %ld", WSAGetLastError());
WSACleanup();
return mes ;
}
// Set to non-blocking mode
u_long iMode=1; // If iMode!=0, non-blocking mode is enabled.
ioctlsocket(RecvSocket,FIONBIO,&iMode);
// Bind the socket to any address and the specified port.
sockaddr_in RecvAddr;
RecvAddr.sin_family = AF_INET;
RecvAddr.sin_port = htons(listenPort);
RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
iResult = bind(RecvSocket, (SOCKADDR *) & RecvAddr, sizeof (RecvAddr));
if (iResult != NO_ERROR)
{
mes.printf("bind failed with error %d\n", WSAGetLastError());
closesocket(RecvSocket);
WSACleanup();
return mes ;
}
// Ready to read data
char RecvBuf[256] ;
int BufLen = 255 ;
int DataCount ;
sockaddr_in SenderAddr;
int SenderAddrSize = sizeof(SenderAddr) ;
// tell user to send data in modal ok dialog
ShowMessage("Ready to receive data, press ok when data transmitted (or not!)") ;
// read data
int retries = 0 ;
do
{
DataCount = recvfrom(RecvSocket,RecvBuf, BufLen, 0,
(SOCKADDR*)&SenderAddr, &SenderAddrSize);
retries++ ;
Sleep(1000) ;
}
while (DataCount < 0 && retries < 5) ;
if (DataCount > 0) // -1 if error
{
RecvBuf[DataCount] = 0 ;
rxData = AnsiString(RecvBuf) ;
mes = "OK" ;
}
else
{
mes.sprintf("recvfrom failed with error %d", WSAGetLastError()) ;
}
// Close
closesocket(RecvSocket);
WSACleanup();
return mes ;
} |
Partager