【问题标题】:implementing sendall() and recvall() in C and python在 C 和 python 中实现 sendall() 和 recvall()
【发布时间】:2016-06-20 10:09:50
【问题描述】:

我目前正在尝试在用 C 编写的服务器中实现 sendall() 函数,并在用 python 编写的相应客户端上实现 recvall() 函数。

当服务器和客户端都用同一种语言编写时(即都用 c 语言或都用 python 编写),我可以让服务器和客户端一起工作,但我不能让它与 c 和服务器一起工作python中的客户端。目前,我想将一个简单的字符串从 c 服务器发送到 python 客户端。

C 中的服务器 sendall() 实现如下(引用自 Beej 的指南):

int sendall(int socket, 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(socket, 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
}

调用函数:

char buf[10] = "test";
    int len;

    len = strlen(buf);

    if (sendall(command_socket, buf, &len) == -1) {
        perror("sendall");
        printf("We only sent %d bytes because of the error!\n", len);
    }

    printf("Bytes sent: %d\n", len);

Python 中的客户端 recvall() 实现(引用自 http://stupidpythonideas.blogspot.com/2013/05/sockets-are-byte-streams-not-message.html):

def recv_one_message(sock):
    lengthbuf = recvall(sock, 4)
    length, = struct.unpack('!I', lengthbuf)
    return recvall(sock, length)

def recvall(sock, count):
    buf = ''
    while count:
        newbuf = sock.recv(count)
        print newbuf

        if not newbuf:
            return None

        buf += newbuf
        count -= len(newbuf)
    return buf

称为:

buf = recv_one_message(command_socket)
print buf

每当我从 C 服务器向 Python 客户端发送消息时,都会返回“无”。我已经跟踪了来自客户端的响应——它正在获取我发送的消息,但最终响应始终为“无”,并且不会打印该消息。我也尝试只返回消息而不是返回 None,这也导致没有打印任何内容。看不到我哪里出错了,有什么想法吗?谢谢。

【问题讨论】:

  • 服务器是用C写的还是用C++写的?没有称为“C/C++”的语言。
  • @FUZxxl 正如写的那样,它应该与两者兼容,尽管我正在编译为 C。
  • lengthbuf = recvall(sock, 4)。我不是蟒蛇专家。但这不是期望对方在数据之前发送长度吗?我没有看到服务器端这样做,因为它似乎只发送数据。
  • 请询问有关 C 或 C++ 的问题,因为这两种语言是不同的。如果您的要求是“有效的 C 但必须编译为 C++”,那么请在您的问题中准确地写出来,以便我们知道。我们经常收到“C/C++ 一切都好”的问题,然后 OP 无法使用答案,因为它使用了 C 特定的功能。
  • @FUZxxl 感谢您的建议,我已删除对 c++ 的引用

标签: python c sockets websocket


【解决方案1】:

假设你有一个非常流利的英语和一个非常流利的法语。他们将无法很好地相互交流。谁有错? -- 谁把他们两个放在一起,期望他们能够在没有事先同意如何他们将通信的情况下进行通信。

您的发送函数和接收函数实现完全不同的协议。发送函数要求接收者已经知道要接收的数据的长度。您的接收功能要求发送方在发送数据之前发送长度。所以你不能混合和匹配它们,因为它们不使用相同的线格式

以下是数十年经验中获得的一些宝贵建议:切勿在未先记录您将在 TCP 上使用的协议的字节处尝试使用 TCP等级。事实上,没有办法知道哪个函数是正确的,哪个函数是错误的,因为没有人知道应该通过线路发送哪些字节。

TCP 是一种字节流协议,要让两个程序在它们之间的 TCP 连接上正常工作,每个程序都必须准确地发送对方期望接收的字节流。确保发生这种情况的最佳方法是首先记录该字节流。

如果您不知道从哪里开始使用此类文档,请查看与您尝试做的类似的最简单的现有协议。查看它的可能协议包括 HTTP、SMTP、IRC 和 DNS。

【讨论】:

    猜你喜欢
    • 2014-09-27
    • 2018-07-24
    • 1970-01-01
    • 2011-04-18
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多