编写客户端和服务器,UDP
Writing Client and Server, UDP
我正在尝试使用UDP编写一个简单的客户端和服务器。
我可以将数据从客户端发送到服务器,服务器接收得很好,但当我将数据从服务器发送到客户端时,它根本不起作用。。。(它没有检测到任何东西,并且卡在recvfrom
功能上。
这是我的服务器代码:
SOCKET ServerOn()
{
SOCKET ListenSocket;
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
exit(0);
}
// Create a SOCKET for listening for
// incoming connection requests.
ListenSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ListenSocket == INVALID_SOCKET)
{
WSACleanup();
exit(1);
}
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("0.0.0.0");
service.sin_port = htons(2583);
if (bind(ListenSocket,(SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR)
{
closesocket(ListenSocket);
WSACleanup();
exit(2);
}
return ListenSocket;
}
在这个函数中,我正在初始化端口2583上的服务器。
这是我在服务器中的另一个代码:
int size = sizeof(service);
char *data = new char[500];
recvfrom(s,data, 500, NULL, (SOCKADDR*)&service, &size); // Getting a new connection
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.0.0.1");
service.sin_port = htons(2583);
int addrSize = sizeof(service);
if (sendto(s, "123", 3, NULL, (struct sockaddr*)&service, addrSize) != 3)
printf("%d", WSAGetLastError()); // Print error if did not send successfully
"10.0.0.1"是客户端的IP(我确定它是(。。。我没有找到从插座自动获取IP的方法,所以我现在只是把它放在一边。。。
这是我的客户代码:
SOCKET ConnectToServer()
{
//----------------------
// Initialize Winsock
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != NO_ERROR)
{
return NULL;
}
//----------------------
// Create a SOCKET for connecting to server
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (ConnectSocket == INVALID_SOCKET)
{
WSACleanup();
return NULL;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr(Default_IP.c_str()); // IP
clientService.sin_port = htons(Default_Port); // Port
//----------------------
// Connect to server.
iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService)); // Connecting
while (iResult == SOCKET_ERROR) // ERROR, could not connect. keep trying
{
iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService)); // Connecting
}
return ConnectSocket;
}
在这段代码中,我连接到客户端。
这是客户端代码的其余部分:
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("10.0.0.1");
service.sin_port = htons(2583);
s = ConnectToServer();
sendto(s, "123", 3, NULL, (struct sockaddr*)&service, addrSize);
while(true)
{
result = recvfrom(s, (char*)waveIn, NUMPTS * sizeof(short int), NULL, (struct sockaddr *)&service, &addrSize);
if (result > 0)
{
std::cout << "New Data!" << std::endl;
}
else
printf("%dn", WSAGetLastError());
}
客户端中的sendto
函数确实起作用,服务器收到了它,尽管当服务器试图将数据发送回客户端时,它什么也没收到,并且它被困在recvfrom
函数上。
我做错了什么?
p.S-我在同一台计算机上运行客户端和服务器,这意味着两者都有相同的IP地址("10.0.0.1"(,但在使用带有TCP的套接字时,它一直对我有效,所以我在这里也这样做了。
尽管如此,我确实尝试在两台不同的计算机上使用了这个代码,但我仍然有同样的错误。。。
谢谢!
当服务器调用recvfrom()
时,它会报告数据来自的IP:Port。你需要将你的回复发送回同一个IP:Port,例如:
sockaddr_in service;
int size = sizeof(service);
char data[500];
int len = recvfrom(s, data, 500, NULL, (SOCKADDR*)&service, &size);
if (len == -1)
printf("recv failed: %d", WSAGetLastError()); // Print error if did not recv successfully
else
{
if (sendto(s, "123", 3, NULL, (struct sockaddr*)&service, size) == -1)
printf("send failed: %d", WSAGetLastError()); // Print error if did not send successfully
}
相关文章:
- UDP 服务器无法发送回复,发送返回 -1,errno 为 22
- C++ UDP 服务器在获取客户端地址配置时发送消息
- 使用C++创建UDP服务器以嵌入跨平台iOS和Android应用程序中
- UDP 服务器每 5 秒重新启动一次
- C++ - 具有多个客户端的 UDP 服务器
- UDP服务器绑定到错误的端口号
- 来自 boost 的 udp 服务器不适用于多线程,但仅在主线程上工作
- UDP 客户端到 UDP 服务器的问题,出现 10057 错误
- sdl_net UDP 服务器设置
- GoDaddy VPS 上的 UDP 服务器
- 如何将异步计时器添加到Boost UDP服务器中
- boost::asio的分段故障,具有deadline_timer的异步udp服务器
- UDP服务器停止接收数据
- WHy 选择挂起 => 两台 UDP 服务器(广播)
- 提升asio-udp服务器
- 在C++/Qt中的UDP服务器客户端聊天
- 如何强制 udp 服务器接收的 udp 客户端套接字绑定到特定客户端端口
- 在多线程UDP服务器中使用多个套接字
- Udp服务器发送数据到特定的客户端,直到任何接收
- c++ UDP服务器崩溃