Escolar Documentos
Profissional Documentos
Cultura Documentos
• Socket
• Ponto inicial e final da troca de dados
• Par de endereços IP e TCP ou IP e UDP
• Campo flags
• Bits DF (don’t fragment) e MF (more
fragments)
• Quando DF=1 roteadores não podem
fragmentar
Primitiva Significado
SOCKET Cria um novo ponto final de comunicação
BIND Associa um endereço local à um soquete
LISTEN Anuncia a intenção de aceitar conexões; determina
o tamanho da fila
ACCEPT Bloqueia até que uma conexão chegue
CONNECT Tenta estabelecer uma conexão
SEND Envia dados
RECEIVE Recebe dados
CLOSE Libera a conexão
Copyright (c) Walter Fetter Lages – p.34
Socket
• Cliente
• Conecta-se ao servidor e portas passados
como argumento
• Envia string passada como argumento
• Aguarda resposta
• Imprime resposta
• Encerra a conexão
Copyright (c) Walter Fetter Lages – p.39
Servidor
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_addr.s_addr=htonl(INADDR_ANY);
serveraddr.sin_port=htons(atoi(argv[1]));
bind(listenfd,(struct sockaddr *)&serveraddr,
sizeof(serveraddr)); Copyright (c) Walter Fetter Lages – p.41
Servidor
listen(listenfd,1024);
clientlen=sizeof(clientaddr);
connectfd=accept(listenfd,
(struct sockaddr *)&clientaddr,&clientlen);
len=read(connectfd,&buffer,sizeof(buffer));
printf("%.*s\n",len,buffer);
write(connectfd,argv[2],strlen(argv[2]));
close(connectfd);
close(listenfd);
return 0;
} Copyright (c) Walter Fetter Lages – p.42
Cliente
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serverent=gethostbyname(argv[1]);
inet_pton(AF_INET,serverent->h_addr,
&serveraddr.sin_addr);
serveraddr.sin_port=htons(atoi(argv[2]));
Copyright (c) Walter Fetter Lages – p.44
Cliente
if(connect(socketfd,(struct sockaddr *)&serveraddr,
sizeof(serveraddr)))
{
perror(argv[1]);
return -errno;
}
write(socketfd,argv[3],strlen(argv[3]));
read(socketfd,buffer,sizeof(buffer));
printf("%.*s\n",(int)sizeof(buffer),buffer);
close(socketfd);
return 0;
} Copyright (c) Walter Fetter Lages – p.45
Referências