嗨,我有一个嵌入式设备,这是2个不同的端口。一种是与原始套接字通信,另一种是与设备通信。其他端口正在使用TCP/IP数据包类型。当我将这两个端口插入同一个vlan的交换机时,会导致网络问题。我的设备有一段时间(~15秒)无法连接TCP/IP套接字,我的原始套接字也无法与其他原始套接字设备通信(其他设备的原始套接字也插入相同的交换机)。下面显示了WireShark日志
wireshark pcap tcp数据包丢弃
但是如果我管理交换机不同的Vlan,我的意思是配置不同的Tcp端口和原始端口不同的Vlan。那么问题就解决了。
这是我的原始套接字源代码;
int createRawSocket(字符
*
sznetwork
_
接口
_
名称){ int i,ioctl
_
袜子,ifindex,未加工
_
sock=0;
ioctl_sock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( ioctl_sock < 0 )
{
printf("\nFailed to create ioctl_sock socket\n");
return -1;
}
/*Create raw socket*/
raw_sock = socket ( AF_PACKET, SOCK_RAW, htons ( ETH_P_ALL ));
if ( raw_sock < 0 )
{
printf("\nFailed to create raw_sock socket\n");
return -1;
}
strncpy ( abc_config.ifr.ifr_name, sznetwork_interface_name, sizeof (abc_config.ifr.ifr_name ));
/*Get the interface index*/
if ( ioctl ( ioctl_sock, SIOCGIFINDEX, &abc_config.ifr ) != 0 )
{
printf ("\nFailed to call ioctl 3\n");
return -1;
}
ifindex = abc_config.ifr.ifr_ifindex;
printf("Successfully got RAW interface index: %i\n\r", ifindex);
/*
* prepare sockaddr_ll
*/
abc_config.socket_address.sll_family = AF_PACKET;
abc_config.socket_address.sll_ifindex = abc_config.ifr.ifr_ifindex;
/*Bind to the raw socket*/
if( bind(raw_sock, (struct sockaddr *)&abc_config.socket_address, sizeof(abc_config.socket_address)) < 0 )
{
printf("\nFailed to bind \n");
return -1;
}
/*
* retrieve corresponding MAC
*/
if (ioctl(raw_sock, SIOCGIFHWADDR, &abc_config.ifr) == -1) {
perror("SIOCGIFINDEX");
close(raw_sock);
return ERROR;
}
abc_config.abc_raw_socket = raw_sock;
abc_config.abc_raw_state = RAW_READY;
return raw_sock;}首先,我被认为是htons ( ETH
_
P
_
所有)使所有传入的数据包都允许。这会导致通信量增加,并且我认为无法建立连接,然后我用原始的
_
sock =插座( AF
_
数据包,套接字
_
RAW,IPPROTO
_
RAW);这次没有接收到任何类型的数据包。我发送的原始数据包的以太网类型: 0xcd03,接收: 0xdd04。
顺便说一下,嵌入式设备有一个Marvell88E6097,8 FE +3 GE堆叠式以太网交换机,电路内部有QoS和802.1Q。Raw和TCP套接字连接了此交换机。
会有什么问题呢?
非常感谢。
发布于 2021-03-01 18:40:20
我通过桥接的方法解决了这个问题。下面是添加linux设备的bridge命令。
brctl addbr br1
brctl addif br1 eth3
ifconfig br1 uphttps://stackoverflow.com/questions/63629945
复制相似问题