解释这段代码,每一句都要解释:intmake_server_socket_q(int,int); intmake_server_socket(int protnum) { returnmake_server_socket_q(protnum,BACKLOG); } intmake_server_socket_q(int portnum,int backlog) { struct sockaddr_in saddr; //创建服务器socket intsock_id; sock_id=socket(PF_INET, SOCK_STREAM, 0); if(sock_id==-1)//失败 { return -1; } bzero((void *)&saddr,sizeof(saddr)); saddr.sin_addr.s_addr=htonl(INADDR_ANY); saddr.sin_port=htons(portnum); saddr.sin_family=AF_INET; //绑定 if(bind(sock_id,(struct sockaddr*)&saddr,sizeof(saddr))!=0) return -1; //监听 if(listen(sock_id,backlog)!=0) return -1; return sock_id; } intconnect_to_server(char *host,int portnum) { int sock; struct sockaddr_in servadd;//响应套接字 struct hostent *hp;//用于获取套接字 sock = socket(PF_INET,SOCK_STREAM,0); if(sock==-1) return -1; //清空 bzero(&servadd,sizeof(servadd)); hp = gethostbyname(host); if(hp==NULL) return -1; bcopy( hp->h_addr,(structsockaddr*)&servadd.sin_addr, hp->h_length); // servadd.sin_addr=htonl(INADDE_ANY); servadd.sin_port=htons(portnum); servadd.sin_family=AF_INET; if(connect(sock,(structsockaddr*)&servadd,sizeof(servadd))!=0) return -1; return sock; }
时间: 2024-02-18 10:59:42 浏览: 173
好的,下面是这段代码每一句的解释:
```
int make_server_socket_q(int, int);
```
这一句声明了一个函数`make_server_socket_q`,它有两个整型参数。
```
int make_server_socket(int protnum) {
return make_server_socket_q(protnum, BACKLOG);
}
```
这一句定义了一个函数`make_server_socket`,它有一个整型参数`protnum`。函数体内部调用了`make_server_socket_q`函数,并传入了`protnum`参数和一个常量`BACKLOG`(在代码中未给出定义)。最后将`make_server_socket_q`函数的返回值作为`make_server_socket`函数的返回值。
```
int make_server_socket_q(int portnum, int backlog) {
struct sockaddr_in saddr;
int sock_id;
sock_id = socket(PF_INET, SOCK_STREAM, 0);
if(sock_id == -1) {
return -1;
}
bzero((void *)&saddr, sizeof(saddr));
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = htons(portnum);
saddr.sin_family = AF_INET;
if(bind(sock_id, (struct sockaddr*)&saddr, sizeof(saddr)) != 0)
return -1;
if(listen(sock_id, backlog) != 0)
return -1;
return sock_id;
}
```
这一句定义了一个函数`make_server_socket_q`,它有两个整型参数`portnum`和`backlog`。函数体内部:
1. 创建了一个`sock_id`变量,用于存储Socket的文件描述符。
2. 调用`socket()`函数创建了一个`PF_INET`类型的Socket,即基于IPv4协议的Socket。如果创建失败,返回-1。
3. 调用`bzero()`函数将`saddr`结构体变量的内存清零。
4. 设置`saddr`结构体变量的属性,包括IP地址、端口号和协议族类型。
5. 调用`bind()`函数将Socket绑定到指定的端口号上。如果绑定失败,返回-1。
6. 调用`listen()`函数监听Socket,设置等待连接队列的最大长度。如果监听失败,返回-1。
7. 返回`sock_id`变量作为函数的返回值。
```
int connect_to_server(char *host, int portnum) {
int sock;
struct sockaddr_in servadd;
struct hostent *hp;
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
return -1;
bzero(&servadd, sizeof(servadd));
hp = gethostbyname(host);
if(hp == NULL)
return -1;
bcopy(hp->h_addr, (struct sockaddr*)&servadd.sin_addr, hp->h_length);
servadd.sin_port = htons(portnum);
servadd.sin_family = AF_INET;
if(connect(sock, (struct sockaddr*)&servadd, sizeof(servadd)) != 0)
return -1;
return sock;
}
```
这一句定义了一个函数`connect_to_server`,它有两个参数,分别是指向字符的指针类型的`host`,和整型类型的`portnum`。函数体内部:
1. 创建了一个`sock`变量,用于存储Socket的文件描述符。
2. 调用`socket()`函数创建了一个`PF_INET`类型的Socket,即基于IPv4协议的Socket。如果创建失败,返回-1。
3. 调用`bzero()`函数将`servadd`结构体变量的内存清零。
4. 调用`gethostbyname()`函数获取指定主机名的IP地址信息。如果获取失败,返回-1。
5. 将获取到的IP地址信息拷贝到`servadd`结构体变量的`s_addr`成员中。
6. 设置`servadd`结构体变量的属性,包括IP地址、端口号和协议族类型。
7. 调用`connect()`函数连接Socket到指定的服务器。如果连接失败,返回-1。
8. 返回`sock`变量作为函数的返回值。
阅读全文