Homework 1 Solution and Some Questions: Ying Zhang
Homework 1 Solution and Some Questions: Ying Zhang
Ying Zhang
Homework 1
total score: 90
Max score: 90
Mean: 85.8858
Std: 6.17
tin_setup_conn()
struct sockaddr_in server_addr;
int sock, sockopt_on=1;
struct hostent * he;
//get a socket
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
perror("socket acquisition failed");
exit(1);
}
// make socket reusable
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, & sockopt_on, sizeof (int)) == -1)
{
perror ("socket reusable option failed");
exit (1);
}
// look up host
he = gethostbyname (servname);
if (he == NULL)
{
perror ("name lookup failed ");
exit (1);
}
// prepare server address datastructure
memset (( char *) &server_addr, 0, sizeof (struct sockaddr_in));
server_addr.sin_family = PF_INET;
server_addr.sin_port = htons (port);
server_addr.sin_addr = *((struct in_addr *)he->h_addr);
// connect to server
if (connect (sock, (struct sockaddr *) &server_addr, sizeof (struct sockaddr_in)) == -1)
{
perror ("connection failed");
exit(1);
}
return sock;
tin_send_hdr()
struct _tin_head header;
int bytes_to_send= sizeof (struct _tin_head);
int bytes_sent=0;
//make sure asgn has TIN_ALEN-1 chars.
if (strlen(asgn) != (TIN_ALEN-1))
{
perror ("assignment name length");
exit(1);
}
header.tih_vers = htons(TIN_VERS);
header.tih_op = htons(op);
memcpy(&header.tih_asgn,asgn,TIN_ALEN-1);
header.tih_asgn[TIN_ALEN-1]='\0';
// prepare packet
memset(&header,0,bytes_to_send);
memcpy(&header.tif_fname,fname,strlen(fname));
header.tif_fsize=htonl(*fsize);
// send header
while (bytes_sent < bytes_to_send)
{
int sent=send (sd, ((char *)(&header)+bytes_sent), bytes_to_send-bytes_sent,0);
if (sent==-1)
{
perror ("tin_send_fhdr");
exit(1);
}
bytes_sent+=sent;
}
return file;
tin_send_file()
int total_to_send = (int)lseek (fd, 0, SEEK_END);
int bytes_to_send;
int bytes_sent=0;
char buff [TIN_DLEN];
// send chunk
while (bytes_sent < bytes_to_send)
{
int sent=send (sd, ((char *)(& buff)+bytes_sent), bytes_to_send-bytes_sent,0);
if (sent==-1)
{
perror ("tin_send_file");
exit(1);
}
bytes_sent+=sent;
}
total_to_send -= bytes_sent;
}
tin_recv_ack()
int bytes_received=0;
char buff_curr, buff_prev=0;
int recvd;
do {
recvd=recv (sd, & (buff_curr), 1,0);
if (recvd==-1)
{
perror ("tin_recv_ack");
exit(1);
}
bytes_received +=recvd;
fprintf(stderr,"%c",buff_curr);
buff_prev=buff_curr;
} while (recvd!=0);
return bytes_received;
tind_recv()
while (try < TIND_MAXTRIES)
{
FD_ZERO (&rfds); //init
FD_ZERO (&efds); //init
FD_SET(td,&rfds); //add td to listening set
FD_SET(td,&efds); //add td to error set
to.tv_sec = TIND_SLEEPUSEC / 1000000;
to.tv_usec = TIND_SLEEPUSEC % 1000000;
// blocking call to select
rval=select(td+1,&rfds,NULL,&efds,&to);
if (rval<0)
{
perror ("select");
exit(1);
}
else if (received != 0)
{
total_received += received;
if (total_received == * blen)
{return NULL;} // correct termination
}
else {
try++; //increment try only if nothing is received
}
}
else
{
try++; //increment try only if nothing is received
}
}