用C和python实现sendall()和recvall()

2024-09-10 22:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

服务器sendall()在C中的实现如下(引用自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
}

调用函数:

^{pr2}$

Python中的Client 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”。我跟踪了客户端传入的响应——它接收我发送的消息,但最终的响应总是“None”,消息不会被打印。我还尝试过只返回消息而不是返回None,这也会导致没有任何内容被打印出来。看不出我哪里出错了,有什么想法吗?谢谢。在


Tags: 服务器none语言消息客户机lenreturncount
1条回答
网友
1楼 · 发布于 2024-09-10 22:21:36

假设你有一个非常流利的英语和一个非常流利的法语。他们将不能很好地相互沟通。谁有错?不管是谁把他们俩放在一起,希望他们能够在没有事先就如何沟通达成一致的情况下进行沟通。在

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

这里有一些经过几十年经验积累的宝贵建议:如果不首先在字节级记录将要在TCP之上使用的协议,就不要尝试使用TCP。事实上,没有办法知道哪个函数是正确的,哪个是错误的,因为没有人知道应该通过网络发送什么字节。在

TCP是一种字节流协议,要使两个程序之间的TCP连接正常工作,每个程序必须精确地发送另一个程序期望接收的字节流。确保这一点发生的最好方法是首先记录字节流。在

如果您不知道从哪里开始编写这样的文档,请看一看最简单的现有协议,它类似于您正在尝试做的事情。可能的协议包括HTTP、SMTP、IRC和DNS。在

相关问题 更多 >