行业分类
如何实现UDP协议?
1个回答
 需要使用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.";

}


2014-01-11 12:40
回答:pansino
关于网站  |  普通版  |  触屏版  |  网页版
06/09 22:55
首页 刷新 顶部