18.3.9 套接字通信

本文提供了一组服务器和客户端程序的示例代码,演示了如何通过套接字进行简单的字符传递与处理过程。

18.3.9  套接字通信

本节将设计两个例子演示套接字通信的过程,其中一个为服务器程序,另一个为客户程序。

1.服务器程序

服务器程序的代码如下:

 

#include <sys/types.h>

#include <sys/socket.h>                         // 包含套接字函数库

#include <stdio.h>

#include <netinet/in.h>                         // 包含AF_INET相关结构

#include <arpa/inet.h>                          // 包含AF_INET相关操作的函数

#include <unistd.h>

int main()

{

   int server_sockfd, client_sockfd; // 用于保存服务器和客户套接字标识符

   int server_len, client_len;          // 用于保存服务器和客户消息长度

   struct sockaddr_in server_address;   // 定义服务器套接字地址

   struct sockaddr_in client_address;   // 定义客户套接字地址

   server_sockfd = socket(AF_INET, SOCK_STREAM, 0); // 定义套接字类型

   server_address.sin_family = AF_INET; // 定义套接字地址中的域

   server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

                                        // 定义套接字地址

   server_address.sin_port = 9734;      // 定义套接字端口

   server_len = sizeof(server_address);

   bind(server_sockfd, (struct sockaddr *) &server_address, server_len); // 定义套接字名字

   listen(server_sockfd, 5);        // 创建套接字队列

   while (1) {

      char ch;

      printf("服务器等待消息/n");

      client_len = sizeof(client_address);

      client_sockfd = accept(server_sockfd,          // 接收连接

            (struct sockaddr *) &client_address,

            (socklen_t *__restrict) &client_len);

      read(client_sockfd, &ch, 1);                   // 读取客户消息

      ch++;

      write(client_sockfd, &ch, 1);                  // 向客户传送消息

      close(client_sockfd);                          // 关闭连接

   }

}

 

该程序监听本地的9734端口,程序运行后等待客户通过该端口连接,从客户传送的消息里读取一个字符,然后对该字符进行加1操作后,再传送给客户,并关闭该连接。

2.客户程序

客户程序的源代码如下:

 

#include <sys/types.h>

#include <sys/socket.h>                     // 包含套接字函数库

#include <stdio.h>

#include <netinet/in.h>                     // 包含AF_INET相关结构

#include <arpa/inet.h>                      // 包含AF_INET相关操作的函数

#include <unistd.h>

int main() {

   int sockfd;                              // 用于保存客户套接字标识符

   int len;                                 // 用于保存客户消息长度

   struct sockaddr_in address;              // 定义客户套接字地址

   int result;

   char ch = 'A';                           // 定义要传送的消息

   sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型

   address.sin_family = AF_INET;        // 定义套接字地址中的域

   address.sin_addr.s_addr = inet_addr("127.0.0.1"); // 定义套接字地址

   address.sin_port = 9734;                             // 定义套接字端口

   len = sizeof(address);

   result = connect(sockfd, (struct sockaddr *) &address, len); 

                                                        // 请求连接

   if (result == -1) {

      perror("连接失败");

      return 1;

   }

   write(sockfd, &ch, 1);                               // 向服务器传送消息

   read(sockfd, &ch, 1);                            // 从服务器接收消息

   printf("来自服务器的消息是%c/n", ch);

   close(sockfd);                                       // 关闭连接

   return 0;

}

 

客户端程序向本地的9734端口请求连接,如果连接成功即发送一个字符A作为消息。然后从服务器传送的消息中读取一个字符,并将该字符输出,退出程序。

将这两个程序分别编译,然后打开两个终端,第一个终端运行服务器程序,这时会出现提示符“服务器等待消息”。第二个终端运行客户程序,客户程序会将字符A作为消息传送给服务器程序,然后服务器程序对该字符进行加1处理,传送回客户程序。客户程序的输出是“来自服务器的消息是B”。这样两个程序就完成了连接和通信。结束客户端程序可使用组合键Ctrl + C

下载 `libmsodbcsql-18.3.so` 文件通常涉及到获取 Microsoft ODBC Driver 18 的完整安装包,因为该文件是 Microsoft ODBC Driver for SQL Server 的一部分。以下是适用于 Linux 系统的推荐步骤: ### 获取和安装 ODBC Driver 18 ODBC Driver 18 是 Microsoft 提供的用于连接 SQL Server 的官方驱动程序。`libmsodbcsql-18.3.so` 是该驱动的一部分,通常位于 `/opt/microsoft/msodbcsql18/lib64/` 目录下。 #### Ubuntu / Debian 系统 可以通过以下命令安装完整的 Microsoft ODBC Driver 18 包[^1]: ```bash sudo su curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 ``` 安装完成后,`libmsodbcsql-18.3.so` 将自动部署在系统中,并可用于应用程序调用。 #### Red Hat / CentOS 系统 对于基于 RPM 的系统,可以使用以下命令安装: ```bash sudo su curl https://packages.microsoft.com/config/rhel/$(rpm -E %{rhel})/prod.repo | tee /etc/yum.repos.d/mssql-release.repo yum install -y msodbcsql18 ``` ### 手动下载 `.so` 文件 如果仅需要手动获取 `libmsodbcsql-18.3.so` 文件,而不进行完整安装,则可以从 Microsoft 官方软件包仓库直接下载对应的 RPM 或 DEB 文件并提取其中的库文件。但这种方式不推荐,因为它可能导致依赖问题和版本不兼容。 例如,在 Ubuntu 上可以尝试以下步骤: 1. 访问 [Microsoft ODBC Driver 18 下载页面](https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?view=sql-server-ver16)。 2. 下载适用于 Linux 的对应平台的安装包。 3. 使用工具如 `dpkg-deb` 提取 DEB 包内容以找到 `.so` 文件: ```bash dpkg-deb -x msodbcsql18_18.3.1.1-1_amd64.deb ./extracted_libs ``` 4. 在提取的目录中查找 `libmsodbcsql-18.3.so` 文件。 ### 验证是否安装成功 安装完成后,可以使用以下命令验证驱动是否可用: ```bash odbcinst -q -d -n "ODBC Driver 18 for SQL Server" ``` 此外,确认 `.so` 文件是否存在: ```bash find /opt/microsoft/msodbcsql18/lib64/ -name "libmsodbcsql-18.3.so" ``` ### 注意事项 - 安装过程中确保网络畅通,以便正确获取远程仓库中的包。 - 如果计划使用 Go 或 Python 进行数据库开发,请确保已安装相应语言的 ODBC 支持模块,例如 `pyodbc` 或 `go-odbc`。 - 不建议手动复制或替换系统库文件,这可能会导致系统不稳定或破坏依赖关系链。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值