问答题
【说明】
代码实例中的服务器通过socket连接向客户端发送字符串"Hello,you are connected!"。只要在服务器上运行该服务器软件,在客户端运行客户软件,客户端就会收到该字符串。
客户端程序代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100 /*每次最大数据传输量*/
main(int argc, char*argv[]){
int sockfd, recvbytes;
char buf[MAXDATASIZE];
stmct hostent*host;
struct sockaddr_in serv_addr;
if {{U}}(1){{/U}} {
fprintf(stderr, "Please enter the server's hostname!/n");
exit(1);
}
if<(host=gethostbyname(argv[1]))=NULL) {
herror("gethostbyname出错!");
exit(1);
}
if ((sockfd = socket(AF_INET, {{U}}(2){{/U}}, 0))=-1) {
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
Serv_addr.sin_addr=*((structin_addr*)host→h_addr);
bzero(&(serv_addr.sin_zero), 8);
if(connect {{U}}(3){{/U}}, (struct sockaddr *)&serv_addr, /
sizeof(struct sockaddr))=-1) {
perror("connect出错!");
exit(1);
}
if((recvbytes=recv {{U}}(4){{/U}}, buf, MAXDATASIZE, 0))=-1) {
perror("recv出错!");
exit(1);
}
buf[recvbytes]='/0';
pfintf("Received: %s", buf);
close(sockfd);
}
【正确答案】
【答案解析】(1)argc<2
//判断参数个数是否为2;即判断是否输入主机名。
(2)SOCK_STREAM
//说明是面向连接的通信
(3)Sockfd
//制定SOCKET号
(4)Sockfd
//制定SOCKET号
客户端程序首先通过服务器域名获得服务器的IP地址,然后创建一个socket,调用connect函数与服务器建立连接,连接成功之后接收从服务器发送过来的数据,最后关闭socket。函数gethost-byname( )是完成域名转换的。由于IP地址难以记忆和读写,所以为了方便,人们常常用域名来表示主机,这就需要进行域名和IP地址的转换。无连接的客户/服务器程序的在原理上和连接的客户/服务器是一样的,两者的区别在于无连接的客户/服务器中的客户一般不需要建立连接,而且在发送接收数据时,需要指定远端机的地址。