关注:116 2014-01-19 13:33

如何实现UDP协议?

已解决 悬赏分:0 - 解决时间 2025-05-14 18:38
  支持(0)  |   反对(0)   |  我来评论 2014-01-11 12:40
 需要使用winsock来写。代码如下:int UDPOpen (int port, int *socketHandle)

{
 SOCKADDR_IN sin;
 WORD wVersionRequested; 
 WSADATA wsaData; 
 int err, t = 1; 
 unsigned long u = 0;
 
 wVersionRequested = MAKEWord(1, 1); 
 if((err = WSAStartup(wVersionRequested, &wsaData)) != 0)
 {
  WSACleanup();
  return err;
 }
 // Open a socket
 *socketHandle = socket(AF_INET, SOCK_DGRAM, 0);
 if(*socketHandle == INVALID_SOCKET)
 {
  err = WSAGetLastError();
  closesocket(*socketHandle);
  WSACleanup();
  return err;
 }
 // bind the socket to an Address and Port
 sin.sin_family = AF_INET; 
 sin.sin_addr.s_addr = INADDR_ANY;
 sin.sin_port = htons(port);
 if((err = bind(*socketHandle, (LPSOCKADDR)&sin, sizeof(sin))) != 0)
 {
  err = WSAGetLastError();
  closesocket(*socketHandle);
  WSACleanup();
  return err;
 }
 // Set the socket to Blocking I/O
 ioctlsocket(*socketHandle, FIONBIO, &u);
 // Set the socket to Broadcast
 setsockopt(*socketHandle, SOL_SOCKET, SO_BROADCAST, (char*)&t, sizeof(int));
 return 0;
}

int UDPRead (int socketHandle, void *data, int maxSize, int timeout)
{
 int fromSize;
 SOCKADDR_IN sin;
 
 fromSize = sizeof(sin);
 // Set the receive timeout period to the one specified by the timeout parameter.
 setsockopt(socketHandle, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(int));
 // Recieve the data on the port.
 if(recvfrom(socketHandle, data, maxSize, 0, (LPSOCKADDR)&sin, &fromSize) < 0)
  return WSAGetLastError();
 return 0;
}

int UDPWrite (int socketHandle, void *data, int dataSize, char* address, int port)
{
 SOCKADDR_IN sin;
 int err;
 
 // Set the address and port option for the write operation
 sin.sin_family = AF_INET; 
 sin.sin_addr.s_addr = inet_addr(address);
 
 sin.sin_port = htons(port);
 // Write the data out the socket
 if(sendto(socketHandle, data, dataSize, 0, (LPSOCKADDR)&sin, sizeof(SOCKADDR)) < 0)
  return WSAGetLastError();
 return 0;
}

int UDPClose (int socketHandle)
{
 // Close the socket
 closesocket(socketHandle);
 return 0;
}

char *UDPErrorString(int error)
{
 switch(error)
 {
  case 0:
   return "No Error.";
   break;
  case WSAENETDOWN:
   return "The network subsystem has failed.";
   break;
  case WSAEADDRINUSE:
   return "Socket address is already in use.";
   break;
  case WSAEINPROGRESS:
  case WSAENOBUFS:
   return "Another Windows Socket Operation is in Progress.";
   break;
  case WSAEMFILE:
   return "Not Enough Available Socket Resources.";
   break;
  case WSAENOTSOCK:
   return "Not a Socket.";
   break;
  case WSAESHUTDOWN:
   return "The Socket has been Shutdown.";
   break;
  case WSAEMSGSIZE:
   return "The data was to large to fit in the specified buffer and has been truncated.";
   break;
  case WSAECONNABORTED:
   return "The connection has been aborted";
   break;
  case WSAECONNRESET:
   return "The connection was reset by the remote site.";
   break;
  case WSAETIMEDOUT:
   return "The connection timed out.";
   break;
  case WSANOTINITIALISED:
   return "Unknown System Error.";
   break;
  case WSAEACCES:
   return "Unknown System Error.";
   break;
  case WSAEINTR:
   return "Unknown System Error.";
   break;
  case WSAEFAULT:
   return "Unknown System Error.";
   break;
  case WSAENETRESET:
   return "Unknown System Error.";
   break;
  case WSAENOTCONN:
   return "Unknown System Error.";
   break;
  case WSAEOPNOTSUPP:
   return "Unknown System Error.";
   break;
  case WSAEWOULDBLOCK:
   return "Unknown System Error.";
   break;
  case WSAEINVAL:
   return "Unknown System Error.";
   break;
  default:
   return "Unknown System Error.";
   break;
 }
 return "Unknown System Error.";
}