使用 recv() 只接收一个字节
Reciving only one byte with recv()
为我的家庭考试用 c 创建一个 tcp 客户端 <-> 服务器程序。 运行 在服务器和客户端之间接收和发送数据时遇到了一些问题。我只能收到一个字节,如果我发送 "abcd" 我会收到 "a"。
(这是双向发生的,因为我对服务器和客户端使用相同的方法)
不知道是发送端的问题还是接收端的问题
这是我的代码:
#define BUFFER_SIZE 1024
char* recived_message;
int send_data(int socket, char* data){
int offset = 0, len = strlen(data);
while (offset != len) {
int nb = send(socket, data + offset, len - offset, 0);
if (nb < 0){
perror("send");
return -1;
}
offset += nb;
}
return 0;
}
int recive(int socket){
int offset = 0;
recived_message = malloc(BUFFER_SIZE);
memset(recived_message, 0, BUFFER_SIZE);
while (offset != BUFFER_SIZE) {
int nb = recv(socket, received_message + offset, BUFFER_SIZE - offset, 0);
if(nb == -1){
perror("read");
return -1;
}else if(nb == 0){
return -1;
}
offset += nb;
}
printf("%d\n", offset);
return 0;
}
char* get_data(){
return recived_message;
}
服务器端
int recive_data(int socket){
char* buffer;
if(recive(socket) != 0){
return -1;
}
*buffer = *get_data();
printf("socket %d: %s\nlength: %lu%", fd, buffer, strlen(buffer));
return 0;
}
部分客户
char* test = "abcd";
for(i=0; i<10; i++) {
send_data(sock, test);
sleep(1);
}
问题就在这里
*buffer = *get_data();
您取消引用 get_data()
返回的指针以仅获取指针指向的第一个元素指针。
而且比这更糟糕,因为您取消引用未初始化的变量 buffer
来写入该单个字符。这将导致未定义的行为。此外,使用此未初始化变量的后续函数调用也会导致未定义的行为。
解决(几乎)所有问题的简单方法:分配给实际变量:
buffer = get_data();
而且我说以上解决了几乎你所有的问题,因为如果字符串的终止零没有被传输怎么办?这也将导致 UB(未定义行为)。如果您收到的数据始终是一个字符串,那么您应该确保它已终止,最好是在 receive
函数中:
int recive(int socket){
...
received_message[offset] = '[=12=]';
return 0;
}
为我的家庭考试用 c 创建一个 tcp 客户端 <-> 服务器程序。 运行 在服务器和客户端之间接收和发送数据时遇到了一些问题。我只能收到一个字节,如果我发送 "abcd" 我会收到 "a"。
(这是双向发生的,因为我对服务器和客户端使用相同的方法)
不知道是发送端的问题还是接收端的问题
这是我的代码:
#define BUFFER_SIZE 1024
char* recived_message;
int send_data(int socket, char* data){
int offset = 0, len = strlen(data);
while (offset != len) {
int nb = send(socket, data + offset, len - offset, 0);
if (nb < 0){
perror("send");
return -1;
}
offset += nb;
}
return 0;
}
int recive(int socket){
int offset = 0;
recived_message = malloc(BUFFER_SIZE);
memset(recived_message, 0, BUFFER_SIZE);
while (offset != BUFFER_SIZE) {
int nb = recv(socket, received_message + offset, BUFFER_SIZE - offset, 0);
if(nb == -1){
perror("read");
return -1;
}else if(nb == 0){
return -1;
}
offset += nb;
}
printf("%d\n", offset);
return 0;
}
char* get_data(){
return recived_message;
}
服务器端
int recive_data(int socket){
char* buffer;
if(recive(socket) != 0){
return -1;
}
*buffer = *get_data();
printf("socket %d: %s\nlength: %lu%", fd, buffer, strlen(buffer));
return 0;
}
部分客户
char* test = "abcd";
for(i=0; i<10; i++) {
send_data(sock, test);
sleep(1);
}
问题就在这里
*buffer = *get_data();
您取消引用 get_data()
返回的指针以仅获取指针指向的第一个元素指针。
而且比这更糟糕,因为您取消引用未初始化的变量 buffer
来写入该单个字符。这将导致未定义的行为。此外,使用此未初始化变量的后续函数调用也会导致未定义的行为。
解决(几乎)所有问题的简单方法:分配给实际变量:
buffer = get_data();
而且我说以上解决了几乎你所有的问题,因为如果字符串的终止零没有被传输怎么办?这也将导致 UB(未定义行为)。如果您收到的数据始终是一个字符串,那么您应该确保它已终止,最好是在 receive
函数中:
int recive(int socket){
...
received_message[offset] = '[=12=]';
return 0;
}