int sck//套接字变量
struct sockaddr_in serv_adr//远程主机的地址
struct hostent *host //指向远程主机的指针
unsigned char databuf[FILEBUF_SIZE]//数据
int bytes = 0, bytesread = 0//字节数,读取到的字节数
host = gethostbyname(server)//根据远程主机的主机名,得到指向远程主机的指针
if (host == (struct hostent *) NULL) { //如果得到指向远程主机的指针失败,报告错误,并返回
perror("gethostbyname failed")
return 0
}memset(&serv_adr, 0, sizeof(serv_adr))//初始化远程主机的地址,结构体内所有成员清零
serv_adr.sin_family = AF_INET //设置地址类型
memcpy(&serv_adr.sin_addr, host->h_addr, host->h_length)//取出指向远程主机的指针中包含的地址信息,赋给远程主机地址变量
serv_adr.sin_port = htons(SERVICE_PORT)//设置端口号,比如http服务对应80端口,ftp对应21端口
if ((sck = socket(AF_INET, SOCK_STREAM, 0)) <0) { //如果建立TCP协议的套接字失败,报告错误,并返回
perror("error on socket()")
return 0
}
if (connect(sck, (struct sockaddr *)&serv_adr, sizeof(serv_adr)) <0) {//如果使用该套接字连接到远程主机失败,报告错误,并返回
perror("error on connect()")
return 0
}write(sck, "DI\n\n", 4)//连接成功,发送内容为"DI\n\n"的消息,远程主机收到该消息,解析后生成目录列表,并将目录列表信息传递回来
printf("Remote directory listing:\n")//输出提示信息“远程主机正在生成目录列表”
while ((bytes = read(sck, databuf, FILEBUF_SIZE)) >0) { //从套接字的数据流中读取远程主机的返回信息(即目录列表),每次读取FILEBUF_SIZE个字节,直到全部读取完毕
write(fileno(stdout), databuf, bytes)//将每次读到的数据,输出到标准输出流(stdout),即屏幕上
bytesread += bytes//接收到的字节数累加
}
close(sck)/* Close the socket */ //通信完成,关闭套接字,关闭连接
return bytesread//返回读取到的字节数(即远程主机返回的信息的大小)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)