udp 网络编程服务端接收到的端口号与客户端中定义的端口号不一样,请高手指教。
为什么下面的程序在server端接收到的 端口号不是5150,而是2711,(或者其他的端口号,每次运行的结果都不一样)???
通过这句来打印:
printf("We successfully received %d bytes from address %s:%d.\n", Ret,
inet_ntoa(SenderAddr.sin_addr), ntohs(SenderAddr.sin_port));
通过这句来打印:
printf("We successfully received %d bytes from address %s:%d.\n", Ret,
inet_ntoa(SenderAddr.sin_addr), ntohs(SenderAddr.sin_port));
server端:
#include <winsock2.h>
#include <stdio.h>
void main(void)
{
WSADATA wsaData;
SOCKET ReceivingSocket;
SOCKADDR_IN ReceiverAddr;
int Port = 5150;
char ReceiveBuf[1024];
int BufLength = 1024;
SOCKADDR_IN SenderAddr;
int SenderAddrSize = sizeof(SenderAddr);
int Ret;
// Initialize Winsock version 2.2
if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
// NOTE: Since Winsock failed to load we cannot use WSAGetLastError
// to determine the error code as is normally done when a Winsock
// API fails. We have to report the return status of the function.
printf("ERROR: WSAStartup failed with error %d\n", Ret);
return;
}
// Create a new socket to receive datagrams on.
if ((ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))
== INVALID_SOCKET)
{
printf("ERROR: socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return;
}
// Setup a SOCKADDR_IN structure that will tell bind that we
// want to receive datagrams from all interfaces using port
// 5150.
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(Port);
ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// Associate the address information with the socket using bind.
if (bind(ReceivingSocket, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr))
== SOCKET_ERROR)
{
printf("ERROR: bind failed with error %d\n", WSAGetLastError());
closesocket(ReceivingSocket);
WSACleanup();
return;
}
printf("We are ready to receive 1 datagram from any interface on port %d...\n",
Port);
// At this point you can receive datagrams on your bound socket.
if ((Ret = recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0,
(SOCKADDR *)&SenderAddr, &SenderAddrSize)) == SOCKET_ERROR)
{
printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError());
closesocket(ReceivingSocket);
WSACleanup();
return;
}
printf("We successfully received %d bytes from address %s:%d.\n", Ret,
inet_ntoa(SenderAddr.sin_addr), ntohs(SenderAddr.sin_port));
// When your application is finished receiving datagrams close
// the socket.
closesocket(ReceivingSocket);
// When your application is finished call WSACleanup.
WSACleanup();
}
client端:
#include <winsock2.h>
#include <stdio.h>
void main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET SendingSocket;
SOCKADDR_IN ReceiverAddr;
int Port = 5150;
int Ret;
/*if (argc <= 1)
{
printf("USAGE: udpsender <receiver IP address>.\n");
return;
}*/
// Initialize Winsock version 2.2
if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
// NOTE: Since Winsock failed to load we cannot use WSAGetLastError
// to determine the error code as is normally done when a Winsock
// API fails. We have to report the return status of the function.
printf("ERROR: WSAStartup failed with error %d\n", Ret);
return;
}
// Create a new socket to receive datagrams on.
if ((SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))
== INVALID_SOCKET)
{
printf("ERROR: socket failed with error %d\n", WSAGetLastError());
WSACleanup();
return;
}
// Setup a SOCKADDR_IN structure that will identify who we
// will send datagrams to. For demonstration purposes, let's
// assume our receiver's IP address is 136.149.3.29 and waits
// for datagrams on port 5150. Obviously you will want to prompt
// the user for an IP address and port number and fill these
// fields in with the data from the user.
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(Port);
//ReceiverAddr.sin_addr.s_addr = inet_addr(argv[1]);
ReceiverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// Send a datagram to the receiver.
if ((Ret = sendto(SendingSocket, "Hello", 5, 0,
(SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr))) == SOCKET_ERROR)
{
printf("ERROR: sendto failed with error %d\n", WSAGetLastError());
closesocket(SendingSocket);
WSACleanup();
return;
}
// When your application is finished sending datagrams close
// the socket.
printf("We successfully sent %d byte(s) to %s:%d.\n", Ret,
inet_ntoa(ReceiverAddr.sin_addr), htons(ReceiverAddr.sin_port));
closesocket(SendingSocket);
// When your application is finished call WSACleanup.
WSACleanup();
}
...全文
相关推荐
c++ udp 程序(含服务端和客户端源码)
**设置地址信息**:使用`sockaddr_in`结构体表示IP地址和端口号。例如,服务端需要绑定到一个特定的端口,客户端则需要知道服务端的IP和端口。3.
UDP数据包接收(客户端)
绑定(Binding): 客户端使用`bind()`函数将套接字与本地IP地址和端口号绑定,这样可以指定接收数据的来源。由于UDP是无连接的,客户端也可以绑定到特定端口以接收服务器发来的数据。4.
基于UDP的socket的客户端与服务端
端口号是自定义的,通常在1024到65535之间,需要确保两端使用相同的端口进行通信。5.
java UDP广播与接收(服务端与客户端)
该项目使用Java语言实现了UDP组播通信中的客户端功能,通过MulticastSocket绑定端口并加入224.0.0.1组播地址,持续接收服务端发送的消息,解析来源IP并输出,适用于局域网内服务发
基于UDP协议的unity客户端,内涵服务端源码
标题中的“基于UDP协议的unity客户端,内涵服务端源码”揭示了这是一个关于使用Unity引擎开发的客户端程序,它依赖于用户数据协议(UDP)来与远程服务器进行通信。


网络编程
