Sou um novato absoluto em redes no Linux. Em particular, eu estava procurando alguns exemplos de protocolo ICMP, em particular, eu estava procurando solicitações de ping e respostas. Normalmente, tudo começa abrindo um soquete bruto
int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
e então há algo como (código incompleto)
while (1) {
sendto(sockfd, ...);
usleep(CERTAIN_TIME);
recvfrom(sockfd, ...);
// then the reply is elaborated
}
Eu estava pensando se também é possível abrir dois desses soquetes brutos: um usado apenas com sendto
, o outro usado com recvfrom
e usá-los por dois threads diferentes:
// initialization
int sendsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
int recvsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
então
// thread 1
while (1) {
sendto(sendsock, ...);
usleep(CERTAIN_TIME);
}
// thread 2
while (1) {
recvfrom(recvsock, ...);
usleeep(CERTAIN_TIME);
}
É seguro?
Como o protocolo ICMP é sem conexão e não há números de porta para vincular ti, todos os soquetes ICMP são essencialmente equivalentes. Vários soquetes no mesmo processo não são diferentes de soquetes em processos diferentes. Chamar
recvfrom()
qualquer um deles retornará quaisquer pacotes ICMP de entrada.Você pode opcionalmente chamar
connect()
um soquete ICMP, para especificar um endereço remoto. Nesse caso, você pode usar callsend()
em vez desendto()
, e ele enviará somente para esse endereço. E você pode chamarrecv()
e ele retornará somente pacotes que vêm desse endereço remoto. Isso fará com que alguns desses soquetes não sejam equivalentes a soquetes desconectados ou soquetes conectados a um endereço diferente. Mas se você estiver fazendo ping no mesmo endereço, você ainda pode usar dois soquetes que estão conectados a esse endereço, um para enviar e o outro para receber.Mas não há benefício em usar sockets separados para as duas direções. Sockets são inerentemente thread-safe.