Chapitre 3 de la programmation du réseau TCP / IP

Yxqq378287007 2022-01-15 02:57:13 阅读数:56

chapitre la programmation du seau

IPAvecPort

Internet Protocol(Protocole réseau)

Adresse du réseau(Internet Address)
IPv4(Internet Protocol version 4),4Famille d'adresses Byte
IPv6(Internet Protocol version 6),16Famille d'adresses Byte

IPv4De4 Les adresses Byte sont divisées en adresses réseau et hôtes (Ordinateur)Adresse.

AAdresse de classe,1 Réseau Byte ID,3 Hôte Byte ID.
(La première0,0xxxxxxx, Plage du premier octet 0~127[2^7-1])
BAdresse de classe,2 Réseau Byte ID,2 Hôte Byte ID.
(Les deux premiers10,10xxxxxx, Plage du premier octet 128[2^7]~191[2^7+2^6-1])
CAdresse de classe,3 Réseau Byte ID,1 Hôte Byte ID.
(Les trois premiers110,110xxxxx, Plage du premier octet 192[2^7+2^6]~223[2^7+2^6+2^5-1])
DAdresse de classe(Adresse de diffusion),Quelle que soit l'adresse du réseau et l'adresse de l'hôte, Est une adresse réservée , Principalement pour la diffusion multipoint (Multicast, Aussi appelé Multicast ).
(Top 41110,1110xxxx, Plage du premier octet 224[2^7+2^6+2^5]~239[2^7+2^6+2^5+2^4-1])
EAdresse de classe,Réservé à une utilisation future.
(Top 41111,1111xxxx, Plage du premier octet 240[2^7+2^6+2^5]~255[2^8-1]240.0.0.0~255.255.255.254 Comme adresse réservée ,255.255.255.255 Comme adresse de diffusion .

Port(Numéro de port)

IP Différencier les ordinateurs ,Port Différencier les sockets .
Numéro de port,16Bits,0~655350.0~1023,Port bien connu(Well-known PORT).
TCPEtUDP La prise permet la duplication du numéro de port .

L'adresse indique

IPv4Structure

struct sockaddr_in {

sa_family_t sin_family;//Famille d'adresses(Address Family)
uint16_t sin_port;//16BitsTCP/UDPNuméro de port
struct in_addr sin_addr;//32BitsIPAdresse
char sin_zero[8];//Non utilisé
};
struct in_addr {

in_addr_t s_addr; //32BitsIPv4Adresse
};

(u)int8_t、(u)int16_t、(u)int32_t,sys/types.h

sa_family_t、socklen_t,sys/socket.h

in_addr_t(IPAdresse,uint32_t)、in_port_t(Numéro de port,uint16_t),netinet/in.h

  • sin_family
    AF_INET,AF_INET6,AF_LOCAL
  • sin_port
    16Numéro de port bit,Ordre des octets réseau
  • sin_addr
    32BitsIPAdresse,Ordre des octets réseau
  • sin_zero
    Sans signification particulière,Fairesockaddr_inEtsockaddrTaille constante, Full Filled as 0.
structural sockaddr {

sa_family_t sin_family;//Famille d'adresses(Address Family)
char sa_data[14];//Adresse
};

Ordre des octets réseau

Ordre des octets(Order)

  • Grande séquence terminale(Big Endian),Les octets supérieurs sont placés à l'adresse inférieure.
  • Petite séquence terminale(Little Endian), Octets de haut niveau placés à l'adresse de haut niveau .

Entier0x12345678,Haut de gamme0x12,Position la plus basse0x78.

Enregistrement de l'ordre des grandes extrémités :
0x20No. 0x21No. 0x22No. 0x23No.
0x12 0x34 0x56 0x78

Enregistrement des petits terminaux :
0x20No. 0x21No. 0x22No. 0x23No.
0x78 0x56 0x34 0x12

Ordre des octets hôtes(Host Byte Order),CPU Méthode d'enregistrement des données ,MainstreamIntelSérie etAMD La série adopte une petite séquence terminale .
Ordre des octets réseau(Network Byte Order), Convenir d'un mode uniforme de transmission des données sur le réseau ,Grande séquence terminale.

Conversion de l'ordre des octets(Endian Conversions)

unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);

hÇa veut direhost(Ordre des octets hôtes),nÇa veut direnetwork(Ordre des octets réseau),sÇa veut direshort,lÇa veut direlong.
htons,shortConversion des données de type de l'ordre des octets hôtes en ordre des octets réseau.

endian_conv.c

#include <stdio.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {

unsigned short host_port = 0x1234;
unsigned short net_port;
unsigned long host_addr = 0x12345678;
unsigned long net_addr;
net_port = htons(host_port);
net_addr = htonl(host_addr);
printf("Host ordered port: %#x \n", host_port);
printf("Network ordered port: %#x \n", net_port);
printf("Host ordered address: %#lx \n", host_addr);
printf("Network ordered address: %#lx \n", net_addr);
return 0;
}
gcc endian_conv.c -o conv
./conv
Host ordered port: 0x1234
Network ordered port: 0x3412
Host ordered address:0x12345678
Network ordered address:0x78563412

Initialisation et attribution des adresses réseau

Chaîne à l'adresse de séquence d'octets réseau

#include <arpa/inet.h>
//Retour réussi32 Bit Big end Order Integer ,Échec retournéINADDR_NONE
in_addr_t inet_addr(const char *string);

inet_addr.c

#include <arpa/inet.h>
int main(int argc, char *argv[]) {

char *addr1="1.2.3.4";
char *addr2="1.2.3.256";
unsigned long conv_addr = inet_addr(addr1);
if(conv_addr==INDADDR_NONE)
printf("Error occured!\n");
else
printf("Network ordered integer addr: %#lx\n", conv_addr);
conv_addr = inet_addr(addr2);
if(conv_addr==INDADDR_NONE)
printf("Error occured!\n");
else
printf("Network ordered integer addr: %#lx\n", conv_addr);
return 0;
}
gcc inet_addr.c -o addr
./addr
//0x4030201
//Error occured!
#include <arpa/inet.h>
//Retour réussi1,Échec retourné0
int inet_aton(const char *string, struct in_addr *addr);

inet_aton.c

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
void error_handling(char *message);
int main(int argc, char *argv[]) {

char *addr1="127.232.124.79";
struct sockaddr_in addr_inet;
if(!inet_aton(addr, &addr_inet.sin_addr))
error_handling("Conversion error");
else
printf("Network ordered integer addr: %#lx\n", addr_inet.sin_addr.s_addr);
return 0;
}
void error_handling(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
gcc inet_aton.c -o aton
./aton
//Network ordered integer addr: 0x4f7ce87f
//79 124 232 127

Chaîne d'adresse de l'ordre des octets réseau

#include <arpa/inet.h>
// Valeur d'adresse de chaîne convertie retournée avec succès ( Copie en temps opportun ),Échec retournénull
char * inet_ntoa(struct in_addr adr);

inet_ntoa.c

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(int argc, char *argv[]) {

struct sockaddr_in addr1, addr2;
char *str_ptr;
char str_arr[20];
addr1.sin_addr.s_addr=htonl(0x01020304);
addr2.sin_addr.s_addr=htonl(0x01010101);
str_ptr=inet_ntoa(addr1.sin_addr);
strcpy(str_arr, str_ptr);
printf("Dotted-Decimal notation1: %s\n", str_ptr);
inet_ntoa(addr2.sin_addr);
printf("Dotted-Decimal notation2: %s\n", str_ptr);
printf("Dotted-Decimal notation3: %s\n", str_arr);
return 0;
}
gcc inet_ntoa.c -o ntoa
./ntoa
//Dotted-Decimal notation1: 1.2.3.4
//Dotted-Decimal notation2: 1.1.1.1
//Dotted-Decimal notation3: 1.2.3.4

Initialisation de l'adresse réseau

struct sockaddr_in addr;
char *serv_ip = "211.217.168.13";
char *serv_port = "9190";
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(serv_ip);
addr.sin_port = htons(atoi(serv_port));

INADDR_ANY

struct sockaddr_in addr;
char *serv_port = "9190";
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
//0.0.0.0,Acquisition automatiqueIPAdresse(Si plusieursIP, Surveillance simultanée )
addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
addr.sin_port = htons(atoi(serv_port));

127.0.0.1,Adresse de retour(loopback address),L'ordinateur lui - mêmeIPAdresse.

WindowsRéalisation

endian_conv_win.c

#include <stdio.h>
#include <winsock2.h>
void ErrorHanding(char *message);
int main(int argc, char *argv[]) {

WSADATA wsaData;
unsigned short host_port = 0x1234;
unsigned short net_port;
unsigned long host_addr = 0x12345678;
unsigned long net_addr;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
ErrorHanding("WSAStartup() error!");
net_port = htons(host_port);
net_addr = htonl(host_addr);
printf("Host ordered port: %#x \n", host_port);
printf("Network ordered port: %#x \n", net_port);
printf("Host ordered address: %#lx \n", host_addr);
printf("Network ordered address: %#lx \n", net_addr);
WSACleanup();
return 0;
}
void ErrorHanding(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
cl /EHsc endian_conv_win.c /Fe:endian_conv_win.exe /link ws2_32.lib
endian_conv_win
Host ordered port: 0x1234
Network ordered port: 0x3412
Host ordered address:0x12345678
Network ordered address:0x78563412

inet_adrconv_win.c

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
void ErrorHanding(char *message);
int main(int argc, char *argv[]) {

WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
ErrorHanding("WSAStartup() error!");
//inet_addr
{

char *addr="127.212.124.78";
unsigned long conv_addr = inet_addr(addr);
if(conv_addr==INDADDR_NONE)
printf("Error occured!\n");
else
printf("Network ordered integer addr: %#lx\n", conv_addr);
}
//inet_ntoa
{

struct sockaddr_in addr;
char *strPtr;
char strArr[20];
addr.sin_addr.s_addr=htonl(0x01020304);
strPtr=inet_ntoa(addr.sin_addr);
strcpy(strArr, strPtr);
printf("Dotted-Decimal notation: %s\n", strArr);
}
WSACleanup();
return 0;
}
void ErrorHanding(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
cl /EHsc inet_adrconv_win.c /Fe:inet_adrconv_win.exe /link ws2_32.lib
inet_adrconv_win
//Network ordered integer addr: 0x4e7cd47f
//78 124 212 127
//Dotted-Decimal notation: 0x1.2.3.4

WSAStringToAddress & WSAAddressToString

#include <winsock2.h>
//Succès0,ÉchecSOCKET_ERROR
INT WSAStringToAddress(LPTSTR AddressString, INT AddressFamily, LPWSAPROTOCOL_INFO lpProtocolInfo, LPSOCKADDR lpAddress, LPINT lpAddressLength);
#include <winsock2.h>
//Succès0,ÉchecSOCKET_ERROR
INT WSAStringToString(LPSOCKADDR lpsaAddress, DWORD dwAddressLength, LPWSAPROTOCOL_INFO lpProtocolInfo, LPSTR lpszAddressString, LPDWORD lpdwAddressStringLength);

conv_addr_win.c

#include <stdio.h>
#include <winsock2.h>
void ErrorHanding(char *message);
int main(int argc, char *argv[]) {

char *strAddr="203.211.218.102:9190";
char strAddrBuf[50];
SOCKADDR_IN servAddr;
int size;
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
ErrorHanding("WSAStartup() error!");
size=sizeof(servAddr);
WSAStringToAddress(strAddr, AF_INET, NULL, (SOCKADDR*)&servAddr, &size);
size=sizeof(strAddrBuf);
WSAStringToString((SOCKADDR*)&servAddr, sizeof(servAddr), NULL, strAddrBuf, &size);
printf("Second conv result: %s\n", strAddrBuf);
WSACleanup();
return 0;
}
void ErrorHanding(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
cl /EHsc conv_addr_win.c /Fe:conv_addr_win.exe /link ws2_32.lib
conv_addr_win
//Second conv result: 203.211.218.102:9190
版权声明:本文为[Yxqq378287007]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201080603388887.html