ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-19 00:56:29  阅读:516  来源: 互联网

标签:sockets websocket c-3 python


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

当它们都使用相同的语言编写时,我可以使服务器和客户端一起工作(即,既可以用c编写,也可以用python编写),但是我不能使它与c中的服务器和client中的客户机一起工作.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,这也导致什么都没有打印出来.有什么想法看不到我要去哪里了吗?谢谢.

解决方法:

假设您的英语说得很流利,法语说得很流利.他们将无法很好地相互交流.谁错了? -谁将他们两个放在一起,希望他们能够进行沟通而无需先就他们如何沟通达成共识.

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

以下是数十年来积累的一些宝贵建议:不要在未首先在字节级别上记录要在TCP之上使用的协议的情况下尝试使用TCP.实际上,由于没有人知道应该通过网络发送什么字节,因此无法知道哪个函数正确和错误.

TCP是一个字节流协议,对于两个程序之间正确的TCP连接正常工作,每个程序必须精确发送对方希望接收的字节流.确保发生这种情况的最佳方法是首先记录该字节流.

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

标签:sockets,websocket,c-3,python
来源: https://codeday.me/bug/20191119/2032290.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有