使用套接字c ++ eclipse删除数组

array gets deleted using sockets c++ eclipse

我有一个使用套接字的双重项目。 它以一个名为 "UdpClient" 的 class 开始,它将消息发送到一个名为 "UdpConnection" 的 class 并输出它从中返回的消息。 问题是,每次我发回消息时,char-array "buffer" 或 "answers" 都会被覆盖,而且我在调试时遇到问题,因为它使用了 2 个项目。想问问有没有人看到收发有问题,我觉得其他都还好。

class UdpClient {

unsigned int from_len;
int sent_bytes;
struct sockaddr_in from;
int sock;
const char * ip_address = "127.0.0.1";
int port_no;
const char* answer;
struct sockaddr_in sin;
int data_len;
char buffer[4096];
int bytes;
string input;
bool stayHere=true;

UdpClient::UdpClient(int port) {

port_no=port;
sock = socket(AF_INET, SOCK_DGRAM, 0);
do {
    answer=NULL;
    cout<< "please choose"<<endl;
    getline(cin,input);
    answer = input.c_str();
    memset(&sin, 0, sizeof(sin));   
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = inet_addr(ip_address);
    sin.sin_port = htons(port_no);
    sendto(sock, answer, data_len, 0, (struct sockaddr *)&sin, sizeof(sin));
    from_len = sizeof(struct sockaddr_in);
    bytes = recvfrom(sock, buffer, sizeof(buffer), 0, (struct sockaddr *) 
    &from, &from_len);
    cout << buffer << endl;

}while(stayHere);
   close(sock);
}

我在项目中的第二个class,serverUdp:

class UdpConnection {

struct sockaddr_in sin;
struct sockaddr_in from;
int sock, bytes;
char buffer[4096];
char answers[4096];
int sentBytes;
int server_port;
std::string returnStr;
char split_char;
unsigned int from_len;
bool stayHere=true;
std::vector<std::string> tokens;
userInterface starting;

UdpConnection::UdpConnection(int port) {

server_port=port;
sock = socket(AF_INET, SOCK_DGRAM, 0);
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port= htons(server_port);
bind(sock, (struct sockaddr*)&sin,sizeof(sin));
from_len = sizeof(struct sockaddr_in);
do {
    memset(&buffer, 0, sizeof(buffer)); //ADDED NOW
    bytes = recvfrom(sock, buffer, sizeof(buffer),0, 
            (struct sockaddr *)&from, &from_len);
    split_char = ' ';           //to split the message
    std::istringstream split(buffer);  
    for (std::string each; std::getline(split, each, split_char); 
        tokens.push_back(each))  {   };
    returnStr=starting.start(tokens);
    tokens.clear();
    strncpy(answers, returnStr.c_str(), sizeof(answers));
    answers[sizeof(answers) - 1] = 0;
    sentBytes=sendto(sock, answers, bytes, 0, (struct sockaddr *)&from, 
    sizeof(from));

 }while(stayHere);
  close(sock);
}

userInterface ("starting.start() method) is the class returning a string. inside it there is a switch-case loop where I receive "tokens" 并向屏幕发送一个字符串。我不会在此处添加它,因为它很长,此外还要转到正确的开关和 TRIES 以打印正确的消息。 它按预期工作,希望每次都打印正确的消息,但问题是这些消息被前一条消息覆盖了。 例如,userInterface class 代码是“return "successfull"”,并且没有字符串对象 return messages.

预期输出为:

successfull
successful movie
successful adding

实际输出为:

successfull
successful movie
successful addie     //the length of last message, cut ng and put e

有谁知道缓冲区数组在哪里需要清理以及为什么每次都给我带来这个麻烦??帮助..

在“UdpClient”class 中,发送数据时您没有设置“data_len”。它应该如下所示:

data_len = strlen(answer);
sendto(sock, answer, data_len, 0, (struct sockaddr *)&sin, sizeof(sin));

同样在 UdpConnection class 中,您应该使用 strlen(answers) 而不是使用 sizeof(answers),因为 sizeof(answers) 将始终给出 4096(答案数组的大小),而 strlen(answers)将为您提供答案中存储的字符串的确切大小。 在发送时你也应该使用 strlen(answers) 而不是 bytes

answers[strlen(answers)] = 0;
sentBytes = sendto(sock, answers, strlen(answers), 0, (struct sockaddr *)&from, sizeof(from));