C语言通过socket发送接收二维字符串数组,二维字符串数组长度不确定,并将二维字符串数组输出,给出具体代码。

时间: 2024-01-11 08:02:09 浏览: 26
以下是一个示例代码,可以通过socket发送接收二维字符串数组,并将其输出: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 int main() { int server_fd, new_socket, valread; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; char *hello = "Hello from server"; char **str_array = NULL; // 二维字符串数组 int rows = 0; // 二维数组的行数 // 创建socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置socket选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定socket if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听socket if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接收客户端连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 接收二维字符串数组的行数 if ((valread = read(new_socket, buffer, 1024)) < 0) { perror("read"); exit(EXIT_FAILURE); } sscanf(buffer, "%d", &rows); // 将字符串转换为整数 // 动态分配二维字符串数组 str_array = (char **)malloc(rows * sizeof(char *)); for (int i = 0; i < rows; i++) { str_array[i] = (char *)malloc(1024 * sizeof(char)); } // 接收二维字符串数组的内容 for (int i = 0; i < rows; i++) { if ((valread = read(new_socket, str_array[i], 1024)) < 0) { perror("read"); exit(EXIT_FAILURE); } } // 输出二维字符串数组 printf("Received string array:\n"); for (int i = 0; i < rows; i++) { printf("%s\n", str_array[i]); } // 发送响应 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); // 释放内存 for (int i = 0; i < rows; i++) { free(str_array[i]); } free(str_array); return 0; } ``` 客户端代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 8080 int main() { int sock = 0, valread; struct sockaddr_in serv_addr; char *hello = "Hello from client"; char **str_array = NULL; // 二维字符串数组 int rows = 3; // 二维数组的行数 // 动态分配二维字符串数组 str_array = (char **)malloc(rows * sizeof(char *)); for (int i = 0; i < rows; i++) { str_array[i] = (char *)malloc(1024 * sizeof(char)); sprintf(str_array[i], "String%d", i+1); // 生成测试数据 } // 创建socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } memset(&serv_addr, '0', sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); // 将IP地址转换为网络字节序 if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 发送二维字符串数组的行数 char rows_str[10]; sprintf(rows_str, "%d", rows); send(sock, rows_str, strlen(rows_str), 0); // 发送二维字符串数组的内容 for (int i = 0; i < rows; i++) { send(sock, str_array[i], strlen(str_array[i]), 0); } // 接收响应 char buffer[1024] = {0}; if ((valread = read(sock, buffer, 1024)) < 0) { perror("read"); exit(EXIT_FAILURE); } printf("%s\n", buffer); // 释放内存 for (int i = 0; i < rows; i++) { free(str_array[i]); } free(str_array); return 0; } ```

相关推荐

最新推荐

recommend-type

C语言中二维数组作为函数参数来传递的三种方法

主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
recommend-type

总结C#删除字符串数组中空字符串的几种方法

C#中要如何才能删除一个字符串数组中的空字符串呢?下面的文章会介绍多种方式来实现清除数组中的空字符串,以及在.net中将字符串数组中字符串为空的元素去除。
recommend-type

C++二维动态数组的创建与删除

C++中用new动态创建二维数组的格式一般是这样:TYPE (*p)[N] = new TYPE [][N]; 其中,TYPE是某种类型,N是二维数组的列数。采用这种格式,列数必须指出,而行数无需指定。在这里,p的类型是TYPE*[N],即是指向一个...
recommend-type

C/C++语言二维数组的传参方法总结

 方法一:形参为二维数组并给定第二维长度  此方法是简单直观的方法,形参与实参一样,容易理解。  举例: #include void subfun(int n, char subargs[][5]) {  int i;  for (i = 0; i &lt; n; i...
recommend-type

怎么拼接中间有0x00符的字符串(数组)

有的人拼接中间有0x00符的字符串提法实际上是错误的,因为中间有0x00的不能算作字符串,字符串的结束符为0x00,且在最末尾。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

spring添加xml配置文件

1. 创建一个新的Spring配置文件,例如"applicationContext.xml"。 2. 在文件头部添加XML命名空间和schema定义,如下所示: ``` <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。