创建tcp客户端< - >用于我家庭考试的服务器程序。在服务器和客户端之间发生reciev并发送数据时遇到了一些问题。我只能收到一个字节,如果我发送" 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);
}
答案 0 :(得分:1)
问题出在这里
dt3[mapply(grepl, x=variables, chk)]
# ID variables chk
#1: 1 a | b b
#2: 2 a | c a
#3: 4 e | b | a a
您取消引用*buffer = *get_data();
返回的指针,只获取指针指向的第一个元素指针。
而且比这更糟糕,因为您取消引用未初始化的变量get_data()
来编写该单个字符。这将导致未定义的行为。此外,使用此未初始化变量的后续函数调用也会导致未定义的行为。
(几乎)所有问题的简单解决方案:分配给实际变量:
buffer
我说上面解决了几乎你所有的问题,因为如果不传输字符串的终止零怎么办?这也将导致UB(未定义行为)。如果您收到的数据始终是一个字符串,那么您应该确保它已终止,最好是在buffer = get_data();
函数中:
receive