📄 client.c
字号:
/*client.c client*/
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<sys/types.h>
#include<string.h>
#include<stdarg.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<net/if.h>
#include<net/if_arp.h>
#include<sys/ioctl.h>
#include<signal.h>
#include<sys/socket.h>
#include<netinet/in.h> /*sockaddr_in 结构体*/
/*下面的这个include可以使程序查询主机名字列表,找出所有与其相关的hostname */
#include<netdb.h>
#include "common.h"
int main(int argc,char *argv[])
/*需要的命令行参数说明:Expected command line parameters:
argv[0]-可执行的名称
argv[1]-目的连接主机名[:客户端将要用到的端口号,这个值将由服务器端给定]
argv[2]-将要获取的文件名
*/
{
int sock, /*套接字描述符*/
cnt; /*I/O缓冲区个数*/
struct sockaddr_in myname; /*Internet套接字名称(addr) */
char buf[65535]; /*I/O缓冲区*/
FILE *fp = NULL;
char file[256];
int server_port = SERVER_PORT;
char *str = NULL;
/*下面查找/ect/hosts 文件*/
struct hostent *hp,*gethostbyaddr();
/*检查用户输入的所有命令行参数.将argv[2]转换成整型,并把他拷贝到myname结构体的
sin_port参数中作为端口号.调用htons函数把这个值用网络字节顺序存放 */
if(argc<3){
printf("network client failure:required parameters missing from the command line\n");
printf("network client:usage");
printf("[executable-name][host name[:port number]][file name]\n");
exit(1);
}
/*建立一个客户端套接字请求服务*/
if((sock=socket(AF_INET,SOCK_STREAM,0))<0){
printf("network client socket failure %d\n",errno);
perror("network client");
exit(2);
}
str = strchr(argv[1], ':');
if (str) {
*str++ = '\0';
server_port = atoi(str);
}
/*把用户提供的端口号转换为整形 */
myname.sin_port = htons(server_port);/*服务器端口号*/
myname.sin_family = AF_INET; /*定义为Internet范围*/
/*这里打印出域名和转换过的端口号 */
printf("network client %s will try to connect to host %s\n",argv[0],argv[1]);
printf("network client %s will use port number %d\n",
argv[0],ntohs(myname.sin_port));
/*获取主机信息*/
hp=gethostbyname(argv[1]);
/*在一切运行正常的情况下,请不要删除这个值,或许它在以后能用到.
也可以把它放在注释中 . */
if(hp==NULL){
printf("network client gethostbyname failure %d\n",errno);
perror("network client");
close(sock);
exit(3);
}
else{
printf("\nServer information obtained via gethostbyname:\n");
printf("\tThe official host name is %s\n",hp->h_name);
printf("\tThe address type is %d\n",hp->h_addrtype);
printf("\tThe length of the address is %d bytes\n",hp->h_length);
printf("\tThe first host address is %x\n",
ntohl(*(int*)hp->h_addr_list[0]));
printf("\tAlias names for the host are:\n");
while(*hp->h_aliases)
printf("\t\t%s\n",*hp->h_aliases++);
}
/*如果是在UNIX systemV中,请用memcpy代替bcopy函数*/
bcopy(hp->h_addr_list[0],&myname.sin_addr.s_addr,hp->h_length);
/*memcpy(&myname.sin_addr.s_addr,hp^h_addr_list[0],hp^h_length);*/
/*在连接到本地或者远程服务器之前需要\核实一下myname结构体中变量的值,将它们打印
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -