### 关于SCO UNIX下的Socket编程知识点 #### 一、Socket编程概述 Socket编程是一种用于网络通信的编程方式,它允许程序之间通过网络进行数据交换。在UNIX系统(包括SCO UNIX)中,Socket API提供了一组函数,使得开发人员能够创建、配置并管理网络连接。 #### 二、代码解析与知识点详解 ##### 1. 客户端代码分析 客户端程序首先检查命令行参数是否正确。如果参数不足或错误,则显示帮助信息并退出。 ```c if (argc != 3) { fprintf(stderr, "Usage: %s hostname portnumber\n", argv[0]); exit(1); } ``` **知识点:** - **命令行参数处理**:`argc`表示命令行参数的个数,`argv`是一个字符串数组,包含了所有命令行参数。 - **错误处理**:使用`fprintf`向标准错误输出错误信息,并通过`exit(1)`退出程序。 接下来获取主机名对应的IP地址。 ```c if ((host = gethostbyname(argv[1])) == NULL) { fprintf(stderr, "Gethostbyname error\n"); exit(1); } ``` **知识点:** - **DNS解析**:`gethostbyname`函数用于将主机名转换为IP地址。 - **错误处理**:同样使用了`fprintf`和`exit(1)`来进行错误处理。 然后创建Socket。 ```c if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Socket Error: %s\n", strerror(errno)); exit(1); } ``` **知识点:** - **Socket创建**:`socket`函数创建一个新的套接字。`AF_INET`表示IPv4协议族,`SOCK_STREAM`表示TCP协议。 - **错误处理**:此处使用了`errno`变量来获取错误码,并通过`strerror`函数将其转换为可读的错误信息。 设置服务器地址并建立连接。 ```c memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(portnumber); server_addr.sin_addr = *((struct in_addr*) host->h_addr); if (connect(sockfd, (struct sockaddr*) (&server_addr), sizeof(struct sockaddr)) == -1) { fprintf(stderr, "Connect Error: %s\n", strerror(errno)); exit(1); } ``` **知识点:** - **地址结构**:`sockaddr_in`结构体用于存储IPv4地址。 - **端口转换**:`htons`函数用于将短整型从主机字节序转换为网络字节序。 - **建立连接**:`connect`函数用于与服务器建立连接。 - **错误处理**:同上。 接收服务器发送的数据并打印。 ```c if ((nbytes = read(sockfd, buffer, 1024)) == -1) { fprintf(stderr, "Read Error: %s\n", strerror(errno)); exit(1); } buffer[nbytes] = '\0'; printf("I have received: [%s]\n", buffer); ``` **知识点:** - **数据接收**:`read`函数从套接字读取数据。 - **字符串处理**:在接收完成后,添加结束符`\0`以形成完整字符串。 关闭Socket并退出。 ```c close(sockfd); exit(0); ``` **知识点:** - **资源释放**:`close`函数关闭套接字。 --- ##### 2. 服务端代码分析 服务端程序首先检查命令行参数是否正确。 ```c if (argc != 2) { fprintf(stderr, "Usage: %s portnumber\n", argv[0]); exit(1); } ``` **知识点:** - **命令行参数处理**:同客户端。 创建Socket。 ```c if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Socket error: %s\n", strerror(errno)); exit(1); } ``` **知识点:** - **Socket创建**:同客户端。 设置服务器地址。 ```c memset(&server_addr, 0, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(portnumber); ``` **知识点:** - **地址设置**:`INADDR_ANY`表示服务器可以监听任何接口上的连接请求。 绑定地址到Socket。 ```c if (bind(sockfd, (struct sockaddr*) (&server_addr), sizeof(struct sockaddr)) == -1) { fprintf(stderr, "Bind Error: %s\n", strerror(errno)); exit(1); } ``` **知识点:** - **绑定地址**:`bind`函数将地址绑定到Socket上。 - **错误处理**:同客户端。 监听连接请求。 ```c if (listen(sockfd, 5) == -1) { fprintf(stderr, "Listen Error: %s\n", strerror(errno)); exit(1); } ``` **知识点:** - **监听状态**:`listen`函数使Socket进入监听状态,参数`5`表示最大等待连接的数量。 接受连接请求。 ```c sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, (struct sockaddr*) (&client_addr), &sin_size); ``` **知识点:** - **接受连接**:`accept`函数用于接受客户端的连接请求,并返回新的套接字。 发送数据给客户端。 ```c write(new_fd, szBuf, strlen(szBuf)); ``` **知识点:** - **数据发送**:`write`函数用于发送数据到指定套接字。 关闭Socket。 ```c close(sockfd); ``` **知识点:** - **资源释放**:同客户端。 #### 三、总结 本示例代码展示了如何在SCO UNIX环境下实现简单的Socket通信,包括客户端和服务端的基本流程和主要步骤。通过对这些代码的学习,可以帮助开发者理解Socket编程的基本原理和技术细节,为进一步深入研究网络编程打下坚实的基础。
#include "tienon.h"
int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&server_addr),\
sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
/* 连接成功了 */
if((nbytes=read(sockfd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("I have received:[%s]\n",buffer);
/* 结束通讯 */
close(sockfd);
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助