代码之家  ›  专栏  ›  技术社区  ›  fingust

C/C++:sys/Socket .h >在循环中使用sEnter(),发送多条消息

c++
  •  0
  • fingust  · 技术社区  · 6 年前

    我让它工作了(修改了一个在线示例),但我不确定它是否是发送多条消息的正确方式。问题是,在我的例子中,我不能在循环的客户端使用send()函数,除非:

    • 代码在两边的循环之前,但在这种情况下,客户端无法重新连接。

    服务器:

        int main(int argc, char const *argv[]) {
        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";
    
        // Creating socket file descriptor
        if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
            perror("socket failed");
            exit(EXIT_FAILURE);
        }
    
        // Forcefully attaching socket to the port 8080
        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);
    
        // Forcefully attaching socket to the port 8080
        if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
            perror("bind failed");
            exit(EXIT_FAILURE);
        }
    
        if (listen(server_fd, 3) < 0) {
            perror("listen");
            exit(EXIT_FAILURE);
        }
    
    
        // Accept
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {
            perror("accept");
            exit(EXIT_FAILURE);
        }
    
        while (true) {
    
            // valread = read( new_socket , buffer, 1024);
            // printf("Buffer: %s\n",buffer );
    
            // if (recv(new_socket, buffer, 1024, MSG_PEEK) > 0) {
            //     printf("Buffer: %s\n",buffer );
            // }
    
            if (read(new_socket, buffer, 1024) > 0) {
                printf("Buffer: %s\n", buffer);
            }
            bzero(buffer, 1024);
        }
    
        send(new_socket, hello, strlen(hello), 0);
        printf("Hello message sent\n");
    
        return 0;
    }
    

    客户:

        int main(int argc, char const *argv[]) { 
        struct sockaddr_in address; 
        int sock = 0, valread; 
        struct sockaddr_in serv_addr; 
        // char *hello = "Hel0o from client"; 
        char *hello; 
        char buffer[1024] = {0}; 
    
        std::string msg;
    
        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); 
    
        // Convert IPv4 and IPv6 addresses from text to binary form 
        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; 
        }
    
        while (true) {
            std::cout << "msg: ";
            std::cin >> msg;
    
            hello = new char[msg.length() + 1];
            std::strcpy(hello, msg.c_str());
    
            send(sock , hello , strlen(hello) , 0 );
        }
    
        printf("Hello message sent\n"); 
        valread = read( sock , buffer, 1024); 
        printf("%s\n",buffer ); 
        return 0; 
    }
    

    正确的做法是什么?

    0 回复  |  直到 6 年前