实验讲解套接字的使用实例

上传人:gb****c 文档编号:242862901 上传时间:2024-09-10 格式:PPT 页数:26 大小:164.50KB
返回 下载 相关 举报
实验讲解套接字的使用实例_第1页
第1页 / 共26页
实验讲解套接字的使用实例_第2页
第2页 / 共26页
实验讲解套接字的使用实例_第3页
第3页 / 共26页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,page,*,实验讲解,1,实验讲解,1,、套接字的使用实例,1,D.E.Comer,D.L.Stevens, TCP/IP,网络互连技术,卷,III:,客户服务器编程和应用,Windows,套接字版,清华大学出版社,Server,Client,Time,2,字节顺序,两种字节排序: 大头(,big-endian),和小头(,little-endian),。,小头(,Little endian,):,低位字节存于低地址,高位字节存于高地址处。例:,23F1H,,,F1,存于,2400H,单元,,23,存于,2401H,单元。,Intel CPU,,大部分小型机使用这种方式。,大头(,big endian,),:,低位字节存于高地址,高位字节存于低地址处。,Motorola,的微处理器,,IBM,大型机使用这种方式。,小头和大头,起源于,Gulliver Travels,:如何敲开鸡蛋呢?是从大头还是从小头。,u_long htonl(u_long hostlong);,/*,主机序=网络序*/,u_long ntohl(u_long netlong);,/*,网络序=主机序 */,htons, ntohs,3,struct,sockaddr_in,short sin_family; /*,协议簇*/,u_short sin_port; /*,端口号*/,struct in_addr sin_addr; /*,网络地址*/,char sin_zero8; /*,给另一主机的网络地址和,IP,地址使用*/,;,struct,in_addr,union ,struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b;,struct u_short s_w1,s_w2; S_un_w;,u_long S_addr; /* IP,地址*/, S_un; /*,4字节 */,地址结构,4,struct hostent FAR *,gethostbyname,(,const char FAR*name;,) /*,利用主机名或域名获得,IP,地址(网络字节序) */,struct,hostent,char FAR * h_name; /* official name of host,如, myhost*/,char FAR * FAR * h_aliases; /* alias list, null-terminated */,short h_addrtype; /* host address type */,short h_length; /* length of address */,char FAR * FAR * h_addr_list; /* list of addresses */,#define h_addr h_addr_list0 /* address, for backward compat */,;,如何把主机名解析为,IP,地址 ?,inet_addr(long ),:将,IP,地址转化为点分十进制。,inet_addr(),,转换,numbers-and-dots,格式的,IP,地址到,unsigned long,5,Gethostbyname(),如果参数为,localhost,,则返回,127.xx.yy.zz,表示回环地址,P371,6,struct servent FAR *,getservbyname,(,const char FAR * name; /*,如,HTTP, DayTime; Telnet */,const char FAR * proro; /*,协议(可选), 如,,udp, tcp */,),struct,servent,char FAR * s_name; /* official service name */,char FAR * FAR * s_aliases; /* alias list */,char FAR * s_proto; /* protocol to use */,short s_port; /* port # */,;,如何把服务名解释为端口号 ?,7,如何把服务名解释为端口号 ?,getservbyport获得的是C:WINDOWSsystem32driversetcservices文件中的信息。,daytime标准服务所用端口为13,使用传输协议为TCP,13十六进制为0d,大头顺序为00 0d,调试的时候会看到小头顺序,为0d 00,对应十进制3328,8,struct,protoent,FAR *,getprotobyname,(,const char FAR * name; /*,如,udp, tcp */,),struct,protoent,char FAR * p_name; /* official protocol name */,char FAR * FAR * p_aliases; /* alias list */,short p_proto; /* protocol # */,;,返回对应于给定协议名的包含名字和协议号的,protoent,结构指针,ppe=Getprotobyname(“tcp”),ppe-p_name=“tcp”,Ppe-p_proto=6,如何把协议名转化为协议号 ?,9,服务器端程序,(,命令行程序,),10,#define WSVERSMAKEWORD(2, 2),#define QLEN 5 /*,请求队列长度 */,11,void main(int argc, char *argv),structsockaddr_in fsin; /* the from address of a client*/,char*service = daytime;/* service name or port number*/,SOCKETmsock, ssock;/* master & slave sockets */,intalen;/* from-address length*/,WSADATA wsadata;,switch (argc) ,case1: break;,case2: service = argv1; break;,default:errexit(usage: TCPdaytimed portn);,12,if (WSAStartup(WSVERS, ,msock = passiveTCP(service, QLEN);,while (1) ,alen = sizeof(struct sockaddr);,ssock = accept(msock, (struct sockaddr *),if (ssock = = INVALID_SOCKET),errexit(accept failed: error number %dn,GetLastError();,TCPdaytimed(ssock);,(void) closesocket(ssock);,(void) closesocket(ssock);,(struct sockaddr *)&fsin,把结构,sockaddr_in*,强制转换为结构,sockaddr*,,两者指向的内存区域大小相同,13,SOCKET,passiveTCP(const char *service, int qlen),return passivesock(service, tcp, qlen);,void,TCPdaytimed(SOCKET fd),char*pts;/* pointer to time string*/,time_tnow;/* current time*/,(void) time(,pts = ctime(,(void) send(fd, pts, strlen(pts), 0);,printf(%s, pts);,ctime,返回字符串指针,14,/*-,-,*,passivesock - allocate & bind a server socket using TCP or UDP,*- */,SOCKET passivesock(const char *service, const char *transport, int qlen),struct servent *pse;/* pointer to service information entry*/,struct protoent *ppe;/* pointer to protocol information entry*/,struct sockaddr_in sin;/* an Internet endpoint address*/,SOCKET s; /* socket descriptor*/,int type; /* socket type (SOCK_STREAM, SOCK_DGRAM) */,memset(,sin.sin_family = AF_INET;,sin.sin_addr.s_addr = INADDR_ANY; /* Map service name to port number */,INADDR_ANY,的具体含义是,绑定到,0.0.0.0,。此时,对所有的地址都将是有效的,如果系统考虑冗余,采用多个网卡的话,那么使用此种,bind,,将在所有网卡上进行绑定。,15,if ( pse =,getservbyname,(service, transport) ),sin.sin_port = htons(ntohs(u_short)pse-s_port),+ portbase);,else if ( (sin.sin_port = htons(u_short)atoi(service) = = 0 ),errexit(cant get %s service entryn, service);,/* Map protocol name to protocol number */,if ( (ppe =,getprotobyname,(transport) = = 0),errexit(cant get %s protocol entryn, transport);,/* Use protocol to choose a socket type */,if (strcmp(transport, udp) = = 0),type = SOCK_DGRAM;,else,type = SOCK_STREAM;,16,/* Allocate a socket */,s =,socket,(PF_INET, type, ppe-p_proto);,if (s = = INVALID_SOCKET),errexit(cant create socket: %dn, GetLastError();,/* Bind the socket */,if (,bind,(s, (struct sockaddr *)&sin, sizeof(sin) = = SOCKET_ERROR),errexit(cant bind to %s port: %dn, service,GetLastError();,if (type = = SOCK_STREAM &,listen,(s, qlen) = = SOCKET_ERROR),errexit(cant listen on %s port: %dn, service,GetLastError();,return s;,17,客户端程序,18,Int main(int argc, char *argv),char*host = localhost;/* host to use if none supplied*/char*service = daytime;/* default service port*/,WSADATA wsadata;,switch (argc) case 1: host = localhost; break; case 3: service = argv2; /* FALL THROUGH */ case 2: host = argv1; break; default: fprintf(stderr, usage: TCPdaytime host portn); exit(1);,Host,是服务器名字,域名,,service,是服务器提供的某个标准服务,19,if (,WSAStartup,(WSVERS, &wsadata) != 0) /*,启动某版本的,DLL */ errexit(“WSAStartup failedn”);TCPdaytime(host, service); /*,建立连接并传输数据 */,WSACleanup(); /*,卸载某版本的,DLL */ printf(“,按任意键继续.”);,getchar();return 0;/* exit */,W,SAStartup,(),参数,1,为版本号,参数,2,存放关于,WSA,的描述信息,20,Void TCPdaytime(const char *host, const char *service), charbufLINELEN+1;/* buffer for one line of text*/SOCKETs;/* socket descriptor*/intcc;/* recv character count*/ s = connectTCP(host, service); /*,建立连接 */,cc = recv(s, buf, LINELEN, 0);while( cc != SOCKET_ERROR ,closesocket(s);,21,SOCKET connectTCP(const char *host, const char *service )return connectsock( host, service, tcp);,指定使用,TCP,连接,22,SOCKET connectsock(const char *host, const char *service, const char *transport )struct hostent*phe;/* pointer to host information entry*/struct servent*pse;/* pointer to service information entry*/struct protoent *ppe;/* pointer to protocol information entry*/struct sockaddr_in sin;/* an Internet endpoint address*/ints, type;/* socket descriptor and socket type*/memset( /* Map service name to port number */if ( pse =,getservbyname,(service, transport) )sin.sin_port = pse-s_port;else if ( (sin.sin_port = htons(u_short)atoi(service) = = 0 )errexit(cant get %s service entryn, service);,根据,transport,参数生成,socket,,根据,host,和,service,建立连接,23,/* Map host name to IP address, allowing for dotted decimal */if ( phe =,gethostbyname,(host) ) memcpy(else if ( (sin.sin_addr.s_addr =,inet_addr,(host) = = INADDR_NONE) errexit(cant get %s host entryn, host);,/* Map protocol name to protocol number */if ( (ppe =,getprotobyname,(transport) = = 0) errexit(cant get %s protocol entryn, transport); /* Use protocol to choose a socket type */if (strcmp(transport, udp) = = 0) type = SOCK_DGRAM;else type = SOCK_STREAM; /* Allocate a socket */s = socket(PF_INET, type, ppe-p_proto);if (s = = INVALID_SOCKET)errexit(cant create socket: %dn, GetLastError();,24,/* Connect the socket */if (,connect,(s, (struct sockaddr *),return s;, / connectsock,25,= 完=,26,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!