问题描述
我正在尝试使用套接字模块(在 Windows 上运行)使用 python 实现服务器客户端应用程序,这是我在互联网上找到的最简单的方法:
服务器:
import socket
UDP_IP = ''
UDP_PORT = 42557
sock = socket.socket(socket.AF_INET6,socket.soCK_DGRAM)
sock.bind((UDP_IP,UDP_PORT))
a = 0
while True:
data,addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print ("received message:",data)
print("addr is:",addr)
sock.close()
break
对于客户:
import socket
UDP_IP = "::1"
UDP_PORT = 42557
MESSAGE = b"0000000EC4030004004000000000000000000000000000000000000000000000"
print ("UDP target IP:",UDP_IP)
print ("UDP target port:",UDP_PORT)
print ("message:",MESSAGE)
sock = socket.socket(socket.AF_INET6,# Internet
socket.soCK_DGRAM) # UDP
sock.sendto(MESSAGE,(UDP_IP,UDP_PORT))
sock.close()
好的,这工作正常。
问题是,我有一个包含多个包的 pcap 文件,如果我复制该文件,我可以看到所有包通过使用wireshark 的接口(以太网卡)。
问题是,我如何使用 socket 模块获取这些包?我尝试了很多方法,但我什么也看不到(我是一个有套接字的菜鸟)。
在pcap文件中,基本信息如下:
源地址:FD53:7CB8:0383:0002:0000:0000:0.0.0.105 目的地地址:FF14:0000:0000:0000:0000:0000:0.0.0.28 源端口:42994 目的端口:42512
在有效载荷中包含一些随机数据。即:0000000EC403000400400000000000000000000000000000000000000000000
提前致谢。
解决方法
我使用了 https://github.com/rigtorp/udpreplay 并且效果很好。 我使用了环回接口,所以 IP 地址不是问题,发送端口和接收端口必须不同。
我的顺序是。
- 从客户端向服务器发送一条短文本消息,并使用 Wireshark 进行记录。
- 使用 Wireshark 记录我发送的消息。
- 使用 udpreplay 消息重放录制的消息并检查服务器是否收到它。
我首先建议:
- 尝试使用其他工具重播您的消息。最初,我尝试使用 tcpreplay,但没有奏效。
- 尝试在同一台 PC 上使用环回接口重放一条消息,以确保您的工具正常工作,然后再转移到另一台 PC 上记录的更复杂的 pcap。
尝试回复这条简单的消息。
./udpreplay -i lo -l hello_from_client.pcapng
我在网上找到的服务器/客户端示例
客户:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define DST_PORT 8080
#define SRC_PORT 8081
#define MAXLINE 1024
#define IP "127.0.0.1"
// Driver code
int main() {
struct sockaddr_in addr,srcaddr;
int sockfd;
char message[] = "Hello,World!";
char *hello = "Hello from clinet";
if ((sockfd = socket(AF_INET,SOCK_DGRAM,0)) < 0) {
perror("socket");
exit(1);
}
memset(&addr,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(IP);
addr.sin_port = htons(DST_PORT);
memset(&srcaddr,sizeof(srcaddr));
srcaddr.sin_family = AF_INET;
srcaddr.sin_addr.s_addr = htonl(INADDR_ANY);
srcaddr.sin_port = htons(SRC_PORT);
if (bind(sockfd,(struct sockaddr *) &srcaddr,sizeof(srcaddr)) < 0) {
perror("bind");
exit(1);
}
sendto(sockfd,(const char *)hello,strlen(hello),MSG_CONFIRM,(const struct sockaddr *) &addr,sizeof(addr));
printf("Hello message sent.\n");
int n,len;
char buffer[256];
n = recvfrom(sockfd,(char *)buffer,MAXLINE,MSG_WAITALL,(struct sockaddr *) &addr,&len);
buffer[n] = '\0';
printf("Server : %s\n",buffer);
close(sockfd);
return 0;
}
服务器:
// Server side implementation of UDP client-server model
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define PORT 8080
#define MAXLINE 1024
// Driver code
int main() {
int sockfd;
char buffer[MAXLINE];
char *hello = "Hello from server";
struct sockaddr_in servaddr,cliaddr;
// Creating socket file descriptor
if ( (sockfd = socket(AF_INET,0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr,sizeof(servaddr));
memset(&cliaddr,sizeof(cliaddr));
// Filling server information
servaddr.sin_family = AF_INET; // IPv4
servaddr.sin_addr.s_addr = INADDR_ANY;
servaddr.sin_port = htons(PORT);
// Bind the socket with the server address
if ( bind(sockfd,(const struct sockaddr *)&servaddr,sizeof(servaddr)) < 0 )
{
perror("bind failed");
exit(EXIT_FAILURE);
}
int len,n;
len = sizeof(cliaddr); //len is value/resuslt
n = recvfrom(sockfd,( struct sockaddr *) &cliaddr,&len);
buffer[n] = '\0';
printf("Client : %s\n",buffer);
sendto(sockfd,(const struct sockaddr *) &cliaddr,len);
printf("Hello message sent.\n");
return 0;
}