xtu湘潭大学网络编程练习题:填空题代码源码解析【第1页/27页】

需积分: 45 0 下载量 106 浏览量 更新于2024-03-13 收藏 186KB PDF 举报
客户库例程实现。阅读以下说明和 C 代码,将__(n)__处缺少的内容填写完整。【说明】源文件 connectsock.c 中定义的函数 connectsock 分配套接口和连接该套接口,该函数通常作为库例程被其它程序调用(如 UDPecho.c 和 TCPecho.c 等)。【源文件 connectsock.c 代码】 /* connectsock.c - allocate socket and connect it */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> /* * Allocate and connect a socket using TCP or UDP */ int connectsock( const char *host, const char *service, const char *transport ) { struct hostent *phe; struct servent *pse; struct sockaddr_in sin; int s, type; bzero( (char *)&sin, sizeof(sin) ); sin.sin_family = AF_INET; /* Determine the protocol to use */ if (strcmp(transport, "udp") == 0) type = SOCK_DGRAM; else type = SOCK_STREAM; /* Map service name to port number */ if ( pse = getservbyname(service, transport) ) sin.sin_port = htons(ntohs((unsigned short)pse->s_port)); else if ( (sin.sin_port = htons((unsigned short)atoi(service))) == 0 ) { fprintf(stderr, "can't get \"%s\" service entry ", service); exit(1); } /* Map host name to IP address */ if ( phe = gethostbyname(host) ) memcpy(&sin.sin_addr, phe->h_addr, phe->h_length); else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE ) { fprintf(stderr, "can't get \"%s\" host entry ", host); exit(1); } /* Allocate a socket */ s = socket(PF_INET, type, 0); if (s < 0) { perror("can't create socket "); exit(1); } /* Connect the socket */ if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) { perror("can't connect to server "); exit(1); } return s; }*** 在这段代码中,connectsock 函数的主要功能是根据传入的参数分配套接口并连接套接口。首先根据传入的参数确定使用的协议是 TCP 还是 UDP,然后根据服务名称或端口号获取端口号,再根据主机名获取 IP 地址。最后通过 socket 函数创建一个套接口,并通过 connect 函数连接到指定的主机。 总结来说,connectsock 函数是一个用于分配套接口并连接套接口的库例程函数,可以在其他程序中被调用,用于 TCP 或 UDP 的通信连接。其核心实现是根据传入的参数获取对应的端口号和 IP 地址,并创建和连接套接口。这样的函数可以帮助实现网络编程中的客户端功能,实现网络通信的目的。