erreur de socket lors de l’utilisation de SOCK_RAW et comment accepter plusieurs clients avec une communication de couche 2

  1. soc = socket (AF_PACKET, SOCK_RAW, htons (ETH_P_ALL)); côté client, à l’exécution, obtient l’erreur == -1

  2. Si accepter la fonction ne peut être utilisée qu’avec les protocoles UDP et TCP supérieurs, comment accepter plusieurs clients avec une communication de couche 2?

où peut trouver le code de la fonction accept, je voudrais le réécrire pour la couche 2.

Mise à jour: après avoir essayé soc = socket (PF_PACKET, SOCK_RAW, htons (ETH_P_ALL)); aussi == -1, obtenez cette erreur

côté serveur et côté client sont tous deux le même ordinateur, local un étrange est que côté serveur en cours d’exécution, il n’a pas cette erreur, mais l’exécution du programme client a une erreur

//#include "stdafx.h" #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  //#include "sock.h" #define MAX_MESSAGE 21000 #define FD_NUM 5 #define tcp_port 5009 //#pragma comment(lib, "ws2_32.lib") //#include  char host_ip[16] = "127.0.0.1"; void task() { struct sockaddr_in local; int opt; int soc; //soc = socket(AF_INET,SOCK_STREAM,0); soc = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (soc==-1) { printf("socket error\n"); } // determine ethernet number /* struct ifreq ifr; size_t if_name_len=strlen(if_name); if (if_name_lenjust use anything here*/ socket_address.sll_protocol = htons(ETH_P_IP); /*index of the network device see full code later how to resortingeve it*/ socket_address.sll_ifindex = 0; /*ARP hardware identifier is ethernet*/ socket_address.sll_hatype = ARPHRD_ETHER; /*target is another host*/ socket_address.sll_pkttype = PACKET_OTHERHOST; /*address length*/ socket_address.sll_halen = ETH_ALEN; /*MAC - begin*/ socket_address.sll_addr[0] = 0x10; socket_address.sll_addr[1] = 0x78; socket_address.sll_addr[2] = 0xD2; socket_address.sll_addr[3] = 0xAD; socket_address.sll_addr[4] = 0x90; socket_address.sll_addr[5] = 0xCB; /*MAC - end*/ socket_address.sll_addr[6] = 0x00;/*not used*/ socket_address.sll_addr[7] = 0x00;/*not used*/ memcpy((void*)buffer, (void*)dest_mac, ETH_ALEN); memcpy((void*)(buffer+ETH_ALEN), (void*)src_mac, ETH_ALEN); eh->h_proto = 0x00; int j = 0; for (j = 46; --j; data[j] = (unsigned char)((int) (255.0*rand()/(RAND_MAX+1.0)))); /* struct sockaddr_in server; int len = sizeof(server); server.sin_family=AF_INET; server.sin_port=htons(5008); server.sin_addr.s_addr=inet_addr(host_ip); int CONN_SOCK = InitSocketTcp(tcp_port); if(connect(CONN_SOCK, (struct sockaddr*)&server, sizeof(server)) == -1) { printf("connection failed\n"); } else { printf("connection ok!\n"); } */ while(1) { char buff[492] = "\0"; printf("input: "); scanf("%s", buff); //send(CONN_SOCK,buff,strlen(buff),0); /*send the packet*/ send_result = sendto(soc, buff, ETH_FRAME_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)); send_result == -1?printf("send error"):0; if(buff[0] == 'q') { //shutdown(CONN_SOCK, SD_SEND); //closesocket(CONN_SOCK); //WSACleanup(); close(soc); exit(0); } } } int main() { //for(int i=10; i!=0; --i) //pthread_create(); task(); return 0; } 

Accept () n’est utilisé que pour TCP ou UDP (son utilisation principale est pratiquement tcp), car il établit une connexion. Une connexion établit une liaison à 3 voies en cas de TCP et échange des informations telles que des numéros de séquence, etc., et est complètement identifiée par un socket (port plus adresse IP).

Contrairement à cela, vous pouvez simplement utiliser les options sendto et receivefrom qui sont normalement utilisées dans le cas du protocole udp, où chaque paquet peut suivre un chemin différent pour atteindre la destination. Vous n’avez pas besoin d’accepter en cas de communication UDP. La même chose peut être étendue aux trames de couche de liaison (L2), c’est-à-dire que chaque côté peut envoyer ou recevoir à volonté sans établir réellement de connexion au préalable.

Cela devrait être fait en utilisant root