udp:连接超时
//UDP.C
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);
//sin.sin_addr.s_addr = inet_addr("218.194.60.224");
// 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 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.";
}
上面是我的UDP.C程序 我是在CVI里面用UDP 因为不支持UDP 所以加载了Wsock32.lib之后,写这样一个源程序,下面的代码是我调用的时候的代码(是在一个每隔10秒循环一次操作的定时空间里面的消息响应事件里面写的)
//UDPRead.c
if((err = UDPOpen (3100, &udpHandle)) != 0)
{
MessagePopup("", UDPErrorString (err));
return 0;
}
if((err = UDPRead (udpHandle, buf, 5000, 10)) != 0)
{
MessagePopup("", UDPErrorString (err));
UDPClose(udpHandle);
return 0;
buf[5] = '\0';
UDPClose (udpHandle);
MessagePopup("", buf);
}
每次连接的时候都报错连接超时