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

Yxqq378287007 2022-01-15 02:54:06 阅读数:335

chapitre la programmation du seau

#include <sys/socket.h>
//Descripteur de fichier réussi,Échec-1
int socket(int domain, int type, int protocol);

Famille de protocole(Protocal Family)

PF_INET,IPv4
PF_INET6,IPv6
PF_LOCAL,LocalUNIX
PF_PACKET,Socket inférieur
PF_IPX,IPX Novell

Type de socket(Type)

Mode de transmission des données pour socket.

  • SOCK_STREAM,Face à la connexion
    Les données ne disparaissent pas,Fiable;
    Transmission séquentielle,Ordre.;
    Aucune limite de données(Boundary),Basé sur des octets,read()Etwrite()Pas nécessairement d'accord(Tampon interne);
    Les sockets correspondent un par un.
int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  • SOCK_DGRAM,Orienté message
    Les données peuvent être perdues ou corrompues ,Pas fiable;
    Transmission rapide et non ordonnée , Grande vitesse désordonnée ;
    Il y a des limites de données ,read()Etwrite()D'accord.( Transmission et réception à la fois );
    Limiter la taille des données par transfert ;
int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

TCPClient

tcp_client.c

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

int sock;
struct sockaddr_in addr;
socklen_t addr_size;
char message[30];
int str_len=0;
int idx=0;
int read_len=0;
if(argc!=3) {

printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock==-1)
error_handling("socket() error");
addr_size = sizeof(addr);
memset(&addr, 0, addr_size);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(argv[1]);
addr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&addr, addr_size)==-1)
error_handling("connect() error");
while(read_len = read(sock, &message[idx++], 1)) {

if(read_len==-1)
error_handling("read() error");
str_len += read_len;
}
message[str_len] = '\0';
printf("Message from server: %s \n", message);
printf("Function read call count: %d \n", str_len);
close(sock);
return 0;
}
void error_handling(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}

Exécution de la compilation

gcc hello_server.c -o hserver
./hserver 9190
gcc tcp_client.c -o hclient
./hclient 127.0.0.1 9190

WindowsPlate - forme

#include <winsock2.h>
//Poignée de socket retournée avec succès,ÉchecINVALID_SOCKET
SOCKET socket(int af, int type, int protocol);

Client

tcp_client_win.c

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

WSADATA wsaData;
SOCKET hSock;
SOCKADDR_IN servAddr;
char message[30];
int strLen=0;
int idx=0;
int readLen=0;
if(argc!=3) {

printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
ErrorHanding("WSAStartup() error!");
hSock = socket(PF_INET, SOCK_STREAM, 0);
if(hSock==INVALID_SOCKET)
ErrorHanding("socket() error");
memset(&servAddr, 0, sizeof(SOCKADDR_IN));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr(argv[1]);
servAddr.sin_port = htons(atoi(argv[2]));
if(connect(hSock, (SOCKADDR *)&servAddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR)
ErrorHanding("connect() error");
while(readLen = recv(hSock, &message[idx++], 1, 0)) {

if(strLen ==-1)
ErrorHanding("read() error");
strLen += readLen;
if(message[idx-1]=='\0')
break;
}
message[strLen] = '\0';
printf("Message from server: %s \n", message);
printf("Function read call count: %d \n", strLen);
closesocket(hSock);
WSACleanup();
return 0;
}
void ErrorHanding(char *message) {

fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}

Exécution de la compilation

cl /EHsc hello_server_win.c /Fe:hServerWin.exe /link ws2_32.lib
hServerWin 9190
cl /EHsc tcp_client_win.c /Fe:hTCPClientWin.exe /link ws2_32.lib
hTCPClientWin 127.0.0.1 9190
版权声明:本文为[Yxqq378287007]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201080603388928.html