C套接字编程-只打印一行

Posted

技术标签:

【中文标题】C套接字编程-只打印一行【英文标题】:C socket programming - printing only one line 【发布时间】:2021-10-23 22:33:18 【问题描述】:

我正在尝试制作连接到 telnet 的 C 套接字程序,我可以向它发送命令。

我的问题是我只收到一条线。

    int sendall(int s, char *buf, int *len)
    
    int total = 0;        // how many bytes we've sent
    int bytesleft = *len; // how many we have left to send
    int n;

    while(total < *len) 
        n = send(s, buf+total, bytesleft, 0);
        if (n == -1)  break; 
        total += n;
        bytesleft -= n;
    

    *len = total; // return number actually sent here

    return n==-1?-1:0; // return -1 on failure, 0 on success


void readall(int sock) 
    char buffer[256];
    /* Now read server response */
    memset(buffer, 0, sizeof(buffer));
    int n = recv(sock, buffer, 255, 0);
    if (n < 0) 
        perror("ERROR reading from socket");
        return;
    
    printf("%d bytes received buffer is: %s\n", n, buffer);
    printf("\n");



int main()

    int network_socket, connection_status;
    struct sockaddr_in server_address;
    char server_response[256];

    network_socket = socket(AF_INET, SOCK_STREAM, 0);

    if (network_socket < 0) 
            printf("Soccet creation failed\n");
            return network_socket;
    

    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);
    server_address.sin_addr.s_addr = inet_addr(IP);

    connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address));

    if (connection_status == -1) 
            printf("Cannot connect to network\n");
            return connection_status;
    
    char buf[10] = "status";
    int a = strlen(buf);

    sendall(network_socket, buf, &a);
    //send(network_socket, "status", strlen("status"), 0);

    readall(network_socket);
    //recv(network_socket, &server_response, sizeof(server_response), 0);

    printf("server response: %s\n", server_response);
    close(network_socket);

输出: 服务器响应:>INFO:Open*** Management Interface Version 3 -- 输入“帮助”获取更多信息

但这只是第一行,当我连接到 telnet(通过终端 ubuntu)时,我总是得到它。 我尝试使用 sendall 和recall 方法,但无论如何输出都是一样的。 我做错了什么?

【问题讨论】:

您连接的服务器似乎在您连接到它时会发送某种信息(您是否尝试过连接实际的telnet 或类似程序?)。您需要阅读所有内容并对其进行解析以找到提示服务器已准备好接受命令的提示。 &amp;server_response 真的应该是server_responserecv 不会 NUL 终止缓冲区,因此如果要将其视为字符串,您需要先将其归零并将缓冲区长度作为 sizeof buffer - 1 传递。否则,检查/使用返回值来确定字符串长度,并适当终止。 为什么你认为你应该收到更多的东西? 我不熟悉 Open*** 管理界面,但有时这类服务器在看到换行符之前不会响应。您可以尝试将"status" 更改为"status\n" 我想如果我发送类似“status”的内容,它会返回open***的状态,因为它是管理界面中的命令? 【参考方案1】:

你没有发送一条线。根据定义,一行由换行符终止。

您没有收到电话。在收到换行符之前,没有代码可以继续调用recv

所以这段代码只能靠运气或魔法才能工作。它不会告诉另一端它的消息在哪里结束,也不会尝试从另一端读取消息。它发送几个字符,然后接收一些随机字符。

您必须实际实现某种协议。您不能仅仅通过 TCP 发送和接收字节的随机组合和长度,并期望它有任何意义。

如果您要发送一条线路,请编写代码来发送一条线路。并使用该代码发送。

如果您应该接收一行,请编写代码来接收 。并使用该代码接收。

TCP 不知道您的“消息”应该是什么。你必须编写代码。

另外,这是一个小问题,但这是错误的:

    recv(network_socket, &server_response, sizeof(server_response), 0);

    printf("server response: %s\n", server_response);

您忽略了recv 的返回值。那么printf 怎么可能知道要打印多少字节呢?您获得了该信息,但从未保留或传递它!

【讨论】:

但我有方法但它不起作用。我将编辑我的帖子以显示这些方法,也许我做错了什么? @RamEir 发送 line 的代码在哪里?接收 line 的代码在哪里?如果您的协议是发送和接收线路,您需要编写实际实现该协议的代码,即理解线路是什么的代码。发送行终止符的代码在哪里?检查行终止符的接收数据的代码在哪里?

以上是关于C套接字编程-只打印一行的主要内容,如果未能解决你的问题,请参考以下文章

socket编程

C中的服务器/套接字编程:数据未正确发送/接收?

网络编程

python----socket编程

QT 网络编程问题

python基础之socket编程