[英]Send and Receive Live data using UDP Socket
我正在练习套接字编程。 这是我的服务器代码。
服务器.cpp
/* UDP Server Sample program*/
#include <Windows.h>
#include <iostream>
#include <winsock.h>
using namespace std;
int main()
{
// Local Variable definitions
cout << "\t\t------- UDP Server---" << endl;
cout << endl;
WSADATA WinSockData;
int iWsaStartup;
int iWsaCleanup;
SOCKET UDPSocketServer;
struct sockaddr_in UDPClient;
char Buffer[512];
int iBufferLen = strlen(Buffer) + 1;
int iBind;
int iReceiveFrom;
int iUDPClientLen = sizeof(UDPClient);
int iCloseSocket;
// STEP-1 Initialization of Winsock
iWsaStartup = WSAStartup(MAKEWORD(2, 2), &WinSockData);
if (iWsaStartup != 0)
{
cout << "WSAStartUp Fun Failed" << endl;
}
cout << "WSAStartUp Success" << endl;
//STEP-2 Fill the UDPClient(SOCKET ADDRESS) Structure
UDPClient.sin_family = AF_INET;
UDPClient.sin_addr.s_addr = inet_addr("169.254.131.8");
UDPClient.sin_port = htons(8001);
// STEP-3 Socket Creation
UDPSocketServer = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (UDPSocketServer == INVALID_SOCKET)
{
cout << "Socket Creation Failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Socket Creation Success" << endl;
// STEP-4 bind the server
iBind = bind(
UDPSocketServer,
(SOCKADDR*)&UDPClient,
sizeof(UDPClient));
if (iBind == SOCKET_ERROR)
{
cout << "Binding Failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Binding Success" << endl;
//STEP-5 RecvFrom Fun from receive data from client
while (1)
{
iReceiveFrom = recvfrom(
UDPSocketServer,
Buffer,
iBufferLen,
MSG_PEEK,
(SOCKADDR*)&UDPClient,
&iUDPClientLen);
if (iReceiveFrom == SOCKET_ERROR)
{
cout << "Receiving failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Receiving Success" << endl;
cout << "Receive Data -> " << Buffer << endl;
}
//STEP-6 CloseSocket Function
iCloseSocket = closesocket(UDPSocketServer);
if (iCloseSocket == SOCKET_ERROR)
{
cout << "Socket Closing failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Socket CLosing Success" << endl;
//STEP-7 WSACLeanUp Fun for Terminating the use of DLL
iWsaCleanup = WSACleanup();
if (iWsaCleanup == SOCKET_ERROR)
{
cout << "WSA CleanUp failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "WSA CleanUp Success" << endl;
system("PAUSE");
return 0;
}
这是客户端代码...
客户端.cpp
/*All right reserved to awinsyspro.com 2019*/
/* UDP Server Sample program*/
#include <Windows.h>
#include <winsock.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
cout << "\t\t------UDP Client------" << endl;
cout << endl;
// Local Variable
WSADATA WinSockData;
int iWsaStartup;
int iWsaCleanup;
SOCKET UDPSocketClient;
struct sockaddr_in UDPServer;
// STEP-1 Initialization of Winsock
iWsaStartup = WSAStartup(MAKEWORD(2, 2), &WinSockData);
if (iWsaStartup != 0)
{
cout << "WSAStartup Failed = " << iWsaStartup << endl;
}
cout << "WSAStartup Success" << endl;
// STEP-2 Fill the UDPServer Structure
UDPServer.sin_family = AF_INET;
UDPServer.sin_addr.s_addr = inet_addr("169.254.131.8");
UDPServer.sin_port = htons(8001);
// STEP-3 Socket Creation
UDPSocketClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (UDPSocketClient == INVALID_SOCKET)
{
cout << "Socket Creation Failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "UDP Socket Creation Success" << endl;
int integ = 2656;
//char Buffer[512] = strint;
int iCloseSocket;
while (1)
{
//STEP-4 Sendto Fun.
string strint = to_string(integ);
const char* Buffer = strint.c_str();
int iSendto;
int iBufferLen = strlen(Buffer) + 1;
int iUDPServerLen = sizeof(UDPServer);
cout << integ << endl;
iSendto = sendto(
UDPSocketClient,
Buffer,
iBufferLen,
MSG_DONTROUTE,
(SOCKADDR*)&UDPServer,
sizeof(UDPServer));
if (iSendto == SOCKET_ERROR)
{
cout << "Sending Data Failed " << endl;
cout << "Error No->" << WSAGetLastError() << endl;
}
cout << "Sending Data Success" << endl;
integ = integ + 1;
// STEP-5 CloseSocket Function
}
iCloseSocket = closesocket(UDPSocketClient);
if (iCloseSocket == SOCKET_ERROR)
{
cout << "Socket Closing failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Close Socket Success" << endl;
// STEP-6 WSACleanUp fun for Terminating the Winsock DLL
iWsaCleanup = WSACleanup();
if (iWsaCleanup == SOCKET_ERROR)
{
cout << "WSA CleanUp failed " << endl;
cout << "Error No-> " << WSAGetLastError() << endl;
}
cout << "Cleanup Success" << endl;
0
system("PAUSE");
return 0;
}
我想在每次循环后以 1 的增量从客户端发送 integer 数据,并在服务器端接收相应的值。 但我只收到常量 integer 值“0”。 我不知道如何完成这个任务。 谢谢
char Buffer[512];
这在自动存储中声明了一个char
数组。 此char
数组完全未初始化。 下一条语句:
int iBufferLen = strlen(Buffer) + 1;
这将尝试通过搜索其终止\0
字节来确定Buffer
中字符串的大小。 毕竟,这就是strlen()
所做的。 很明显,此处的意图是将iBufferLen
设置为 512 或sizeof(Buffer)
,而不是其当前字符串的大小加 1,这显然是不正确的。
由于Buffer
未初始化,不包含任何字符串,并且可能包含随机二进制垃圾,从这一点来看,显示的代码是未定义的行为。
如果您还没有学会如何使用调试器,您应该认为这是学习如何使用调试器的绝佳机会。 如果您使用调试器运行程序,一次一行,调试器会立即向您显示iBufferLen
可能设置为 1 或 0,而不是 512。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.