我正在使用示例udp客户端程序发送IP广播数据包,并尝试使用tcpdump捕获相同内容并使用以下示例命令
sudo tcpdump -n src port 1050 sudo tcpdump -i em1“port 1050”
这是ip route的输出(带有修改的IP地址)
default via x.x.x.x dev em1 proto static
x.46.78.0/23 dev em1 proto kernel scope link src x.y.79.16 metric 1
x.y.0.0/16 dev p4p1.1102 proto kernel scope link src x.y.7.45 metric 6
x.y.0.0/16 dev p4p1.1103 proto kernel scope link src x.y.7.45 metric 6
x.y.0.0/24 dev p4p1.1100 proto kernel scope link src x.y.0.1 metric 6
x.y.1.0/24 dev prvn-bridge proto kernel scope link src x.y.1.10 metric 20
x.y.122.0/24 dev virbr0 proto kernel scope link src x.y.122.1
x.0.0.0/4 dev p4p1.1102 proto static
x.0.0.0/4 dev p4p1.1103 proto static
//Client code used for sending IP Broadcast packet (modified version of http://www.csee.usf.edu/~christen/tools/udpClient.c)
#define BSD // WIN for Winsock and BSD for BSD sockets
//----- Include files ---------------------------------------------------------
#include <stdio.h> // Needed for printf()
#include <string.h> // Needed for memcpy() and strcpy()
#ifdef WIN
#include <windows.h> // Needed for all Winsock stuff
#endif
#ifdef BSD
#include <sys/types.h> // Needed for sockets stuff
#include <netinet/in.h> // Needed for sockets stuff
#include <sys/socket.h> // Needed for sockets stuff
#include <arpa/inet.h> // Needed for sockets stuff
#include <fcntl.h> // Needed for sockets stuff
#include <netdb.h> // Needed for sockets stuff
#endif
//----- Defines ---------------------------------------------------------------
#define PORT_NUM 1050 // Port number used
//===== Main program ==========================================================
void main(void)
{
#ifdef WIN
WORD wVersionRequested = MAKEWORD(1,1); // Stuff for WSA functions
WSADATA wsaData; // Stuff for WSA functions
#endif
int client_s; // Client socket descriptor
struct sockaddr_in server_addr; // Server Internet address
int addr_len; // Internet address length
char out_buf[4096]; // Output buffer for data
char in_buf[4096]; // Input buffer for data
int retcode; // Return code
int iOptVal; // Socket option value
int iOptLen; // Socket option length
int count;
#ifdef WIN
// This stuff initializes winsock
WSAStartup(wVersionRequested, &wsaData);
#endif
// Create a socket
client_s = socket(AF_INET, SOCK_DGRAM, 0);
if (client_s < 0)
{
printf("*** ERROR - socket() failed \n");
exit(-1);
}
// Fill-in server socket's address information
server_addr.sin_family = AF_INET; // Address family to use
server_addr.sin_port = htons(PORT_NUM); // Port num to use
server_addr.sin_addr.s_addr = (INADDR_ANY); // Need this for Broadcast
// Set socket to use MAC-level broadcast
iOptVal = 1;
iOptLen = sizeof(int);
setsockopt(client_s, SOL_SOCKET, SO_BROADCAST, (char*)&iOptVal, iOptLen);
// Assign a message to buffer out_buf
strcpy(out_buf, "Test message from CLIENT to SERVER");
// Now send the message to server.
for (count = 0 ; count < 100; count++)
{
printf("Sending a broadcast packet\n");
retcode = sendto(client_s, out_buf, (strlen(out_buf) + 1), 0,
(struct sockaddr *)&server_addr, sizeof(server_addr));
if (retcode < 0)
{
printf("*** ERROR - sendto() failed \n");
exit(-1);
}
sleep(5);
}
#if 0
// Wait to receive a message
addr_len = sizeof(server_addr);
retcode = recvfrom(client_s, in_buf, sizeof(in_buf), 0,
(struct sockaddr *)&server_addr, &addr_len);
if (retcode < 0)
{
printf("*** ERROR - recvfrom() failed \n");
exit(-1);
}
#endif
// Output the received message
printf("Received from server: %s \n", in_buf);
// Close all open sockets
#ifdef WIN
retcode = closesocket(client_s);
if (retcode < 0)
{
printf("*** ERROR - closesocket() failed \n");
exit(-1);
}
#endif
#ifdef BSD
retcode = close(client_s);
if (retcode < 0)
{
printf("*** ERROR - close() failed \n");
exit(-1);
}
#endif
#ifdef WIN
// This stuff cleans-up winsock
WSACleanup();
#endif
}
但由于某种原因,我看不到数据包。有人可以帮我解决这个问题。
感谢。
答案 0 :(得分:0)
您需要使用INADDR_BROADCAST而不是INADDR_ANY。