現在想實作在單片機與PC之間的UDP通信,單片機發送報文,PC使用winsock接收,兩者通過網線連接,server的代碼是隨便找的demo,C++。
實作通信倒是沒什么問題,可是現在把網線拔掉,server還能不斷收報文,感覺就是報文存盤在了某個快取里,然后,server一直讀取的是快取的資料。
單片機發送報文周期500微秒左右,PC接收效率1ms~5ms。
是因為接受效率太低導致快取入大于出?所以網線拔了還能讀到報文?
那么怎么再提高PC的接收效率呢?
之前一直沒接觸過通信,請大家幫忙看看有什么問題,謝謝大家。
#define CAN_ETH_PDU_UDP_BUF_LENGTH 1500
void receiver() {
/* UDP socket communication */
WSADATA wsaData;
SOCKET sockfd;
int ret;
int len;
SOCKADDR_IN addr, cli;
char buf[CAN_ETH_PDU_UDP_BUF_LENGTH] = { 0 };
int ByteReceived = 0, SelectTiming, ErrorCode;
// Initialize Winsock version 2.2
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Server: WSAStartup failed with error %ld\n", WSAGetLastError());
}
else
printf("Server: The Winsock DLL status is %s.\n", wsaData.szSystemStatus);
sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockfd == INVALID_SOCKET)
{
printf("Server: Error at socket(): %ld\n", WSAGetLastError());
// Close the socket
closesocket(sockfd);
// Clean up
WSACleanup();
}
else
printf("Server: socket() is OK!\n");
addr.sin_family = AF_INET;
addr.sin_port = htons(UDP_CAM_PORT);
addr.sin_addr.s_addr = INADDR_ANY;
//addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
//將套介面s置于”非阻塞模式“
u_long u1 = 1;
ioctlsocket(sockfd, FIONBIO, (u_long*)&u1);
int size = 1 * 1024 * 1024;
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (const char*)&size, sizeof(int));
ret = ::bind(sockfd, (SOCKADDR *)&addr, sizeof(addr));
if (ret == SOCKET_ERROR)
{
printf("bind error\n");
// Close the socket
closesocket(sockfd);
// Do the clean up
WSACleanup();
}
else
printf("Server: bind() is OK!\n");
// Some info on the receiver side...
printf("Server: Receiving IP(s) used: %s\n", inet_ntoa(addr.sin_addr));
printf("Server: Receiving port used: %d\n", htons(addr.sin_port));
printf("Server: I\'m ready to receive a datagram...\n");
len = sizeof(cli);
while (1) {
ByteReceived = recvfrom(sockfd, buf, sizeof(buf), 0, (SOCKADDR *)&cli, &len);
if (ByteReceived > 0)
{
printf("Server: Total Bytes received: %d\n", ByteReceived);
printf("Server: The data is \"%s\"\n", buf);
//continue;
}
else if (ByteReceived <= 0)
{
printf("Server: Connection closed with error code: %ld\n", WSAGetLastError());
//continue;
}
else
{
printf("Server: recvfrom() failed with error code: %d\n", WSAGetLastError());
}
}
// When your application is finished receiving datagrams close the socket.
printf("Server: Finished receiving. Closing the listening socket...\n");
if (closesocket(sockfd) != 0)
printf("Server: closesocket() failed! Error code: %ld\n", WSAGetLastError());
else
printf("Server: closesocket() is OK\n");
// When your application is finished call WSACleanup.
printf("Server: Cleaning up...\n");
if (WSACleanup() != 0)
printf("Server: WSACleanup() failed! Error code: %ld\n", WSAGetLastError());
else
printf("Server: WSACleanup() is OK\n");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/83034.html
標籤:網絡通信
