在C和python中实现sendall()和recvall()

时间:2016-03-06 23:27:48

标签: python c sockets websocket

我目前正在尝试在用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客户端发送消息时,我都会返回&#34;无。&#34;我已经跟踪了客户端的响应 - 它收到了我发送的消息,但最终的响应始终是&#34; none&#34;并且不会打印消息。我也尝试过只返回消息而不是返回None,这也导致没有打印出来。无法看到我出错的地方,有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:3)

假设你有一个完美流利的英语演讲者和一个完美流利的法语演讲者。他们将无法很好地相互沟通。谁有过错? - 无论是谁将他们两个放在一起,希望他们能够在没有事先同意他们将如何沟通的情况下进行沟通。

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

以上是几十年经验中获得的一些有价值的建议:从不尝试使用TCP而不首先记录您将在TCP上使用的协议水平。实际上,没有办法知道哪个函数是正确的,哪个是错误的,因为没有人知道应该通过网络发送什么字节。

TCP是一种字节流协议,并且为了使两个程序在它们之间使用TCP连接正常工作,每个程序必须精确地发送另一个希望接收的字节流。确保发生这种情况的最佳方法是首先记录该字节流。

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