使服务器端和客户端各传递1次字符串。考虑到使用TCP协议,所以传递字符串前先以4字节整数型方式传递字符串长度。连接时服务器端和客户端数据传输格式如下。 另外,不限制字符串传输顺序及种类,但须进行3次数据交换。
时间: 2024-05-15 09:13:56 浏览: 3
好的,我们可以使用以下步骤来实现这个需求:
1. 客户端向服务器端发送字符串长度。我们可以使用 `send()` 函数来发送数据,其中第一个参数为套接字文件描述符,第二个参数为要发送的数据,第三个参数为数据的长度(这里为4个字节)。代码如下:
```c
int str_len = strlen(str);
int n = send(sockfd, &str_len, sizeof(str_len), 0);
```
2. 服务器端接收到字符串长度后,根据长度创建一个缓冲区,并接收字符串数据。我们可以使用 `recv()` 函数来接收数据,其中第一个参数为套接字文件描述符,第二个参数为接收数据的缓冲区,第三个参数为缓冲区的长度(这里为字符串长度),第四个参数为接收数据时的标志位。代码如下:
```c
int str_len;
int n = recv(newsockfd, &str_len, sizeof(str_len), 0);
char* buffer = (char*)malloc(str_len+1); // 加1是为了存放字符串结尾的'\0'
n = recv(newsockfd, buffer, str_len, 0);
buffer[str_len] = '\0'; // 添加字符串结尾
```
3. 服务器端向客户端发送字符串长度。代码与第一步相同。
```c
int n = send(newsockfd, &str_len, sizeof(str_len), 0);
```
4. 客户端接收到字符串长度后,根据长度创建一个缓冲区,并接收字符串数据。代码与第二步相同。
```c
int str_len;
int n = recv(sockfd, &str_len, sizeof(str_len), 0);
char* buffer = (char*)malloc(str_len+1); // 加1是为了存放字符串结尾的'\0'
n = recv(sockfd, buffer, str_len, 0);
buffer[str_len] = '\0'; // 添加字符串结尾
```
5. 最后,客户端向服务器端发送字符串数据。代码如下:
```c
int n = send(sockfd, str, strlen(str), 0);
```
6. 服务器端接收到字符串数据后,可以直接使用。代码如下:
```c
// 在第二步中已经接收到了字符串数据,直接使用即可
printf("Received message: %s\n", buffer);
```
需要注意的是,在以上步骤中,每次发送和接收数据都要进行错误检查,以确保数据的正确传输。具体实现可以参考以下代码:
```c
// 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 12345
#define SERVER_ADDR "127.0.0.1"
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 填写服务器地址信息
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
// 连接服务器
if (connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
// 要发送的字符串
char* str = "Hello World!";
// 发送字符串长度
int str_len = strlen(str);
int n = send(sockfd, &str_len, sizeof(str_len), 0);
if (n == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收字符串长度和数据
n = recv(sockfd, &str_len, sizeof(str_len), 0);
if (n != sizeof(str_len)) {
perror("recv");
exit(EXIT_FAILURE);
}
char* buffer = (char*)malloc(str_len+1);
n = recv(sockfd, buffer, str_len, 0);
if (n != str_len) {
perror("recv");
exit(EXIT_FAILURE);
}
buffer[str_len] = '\0';
// 发送字符串数据
n = send(sockfd, str, strlen(str), 0);
if (n == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 关闭套接字
close(sockfd);
return 0;
}
// 服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 12345
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定地址和端口号
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(sockfd, 10) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
// 接收连接请求
struct sockaddr_in cli_addr;
socklen_t cli_len = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
if (newsockfd == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收字符串长度和数据
int str_len;
int n = recv(newsockfd, &str_len, sizeof(str_len), 0);
if (n != sizeof(str_len)) {
perror("recv");
exit(EXIT_FAILURE);
}
char* buffer = (char*)malloc(str_len+1);
n = recv(newsockfd, buffer, str_len, 0);
if (n != str_len) {
perror("recv");
exit(EXIT_FAILURE);
}
buffer[str_len] = '\0';
// 发送字符串长度和数据
n = send(newsockfd, &str_len, sizeof(str_len), 0);
if (n == -1) {
perror("send");
exit(EXIT_FAILURE);
}
n = send(newsockfd, buffer, str_len, 0);
if (n == -1) {
perror("send");
exit(EXIT_FAILURE);
}
// 接收字符串数据
char str[1024];
n = recv(newsockfd, str, sizeof(str), 0);
if (n == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
str[n] = '\0';
// 输出接收到的字符串
printf("Received message: %s\n", str);
// 关闭套接字
close(newsockfd);
close(sockfd);
return 0;
}
```